{
  "schemaVersion": 1,
  "checkedAt": "2026-11-02T03:53:06.904Z",
  "scope": {
    "total": 19681,
    "snapshotDate": "2026-09-30",
    "observedAt": "2026-10-31T10:27:09.045Z",
    "types": {
      "41": "치과병원",
      "51": "치과의원"
    },
    "sourceFile": "data/clinics.json",
    "sourceDataSha256": "22ca2821563ec5ba0a78d903e55585ad3a0ecd5da4ed12bb28e667b51b05c5fc",
    "originalModified": false,
    "externalAssetCollectionsIncluded": false
  },
  "limitations": [
    "점검 대상은 공공데이터의 치과병원·치과의원 스냅샷입니다. 종합병원 등의 치과는 이 모집단에 포함하지 않습니다.",
    "누락·형식·중복 의심을 점검하며 현재 영업·폐업·이전·전화 연결·주소 실재 여부를 전수 확인하지 않습니다.",
    "중복 후보는 자동 병합하지 않습니다. 동일 주소나 전화만으로 같은 기관이라고 판단하지 않습니다.",
    "항목별 분모는 전체 수록 행입니다. 한 행에 여러 항목이 겹치므로 건수를 더해 기관 수로 해석하면 안 됩니다.",
    "등록된 0은 값이며 null은 미확인입니다. 시간과 장비 자료의 부재를 미운영 또는 0대로 바꾸지 않습니다."
  ],
  "summary": {
    "total": 19681,
    "byLevel": {
      "error": 0,
      "review": 948,
      "missing": 18988,
      "candidate": 8
    },
    "duplicateIdGroups": 0,
    "candidateGroups": 4,
    "candidateRuleGroups": 5,
    "candidateInstitutions": 8,
    "sharedPhoneGroups": 22,
    "sharedAddressGroups": 38,
    "manifestMismatches": 0,
    "sourceCatalogIssues": 0,
    "currentOperatingStatusVerified": 0
  },
  "metrics": {
    "name": {
      "label": "기관명",
      "total": 19681,
      "recorded": 19681,
      "missing": 0,
      "formatPass": 19681,
      "formatReview": 0,
      "recordedPercent": 100,
      "definition": "비어 있지 않은 원문 수"
    },
    "address": {
      "label": "주소",
      "total": 19681,
      "recorded": 19681,
      "missing": 0,
      "formatPass": 19681,
      "formatReview": 0,
      "recordedPercent": 100,
      "definition": "한글·제어 문자 점검. 실제 주소 유효성이나 이전 여부는 확인하지 않음"
    },
    "phone": {
      "label": "전화번호",
      "total": 19681,
      "recorded": 19609,
      "missing": 72,
      "formatPass": 18776,
      "formatReview": 833,
      "recordedPercent": 99.6,
      "definition": "단일 전화 링크 형식. 전화 연결·번호 할당 여부 미확인"
    },
    "postalCode": {
      "label": "우편번호",
      "total": 19681,
      "recorded": 19681,
      "missing": 0,
      "formatPass": 19681,
      "formatReview": 0,
      "recordedPercent": 100,
      "definition": "5자리 숫자 형식. 주소와의 일치 여부 미확인"
    },
    "coordinates": {
      "label": "위도·경도",
      "total": 19681,
      "recorded": 19676,
      "missing": 5,
      "formatPass": 19676,
      "formatReview": 0,
      "recordedPercent": 100,
      "definition": "두 좌표의 유한 숫자·지구 좌표 범위 점검. 주소 위치 대조 아님"
    },
    "website": {
      "label": "신고 홈페이지",
      "total": 19681,
      "recorded": 1718,
      "missing": 17963,
      "formatPass": 1596,
      "formatReview": 122,
      "recordedPercent": 8.7,
      "definition": "HTTP(S) URL 구문. 접속·공식성 미확인"
    },
    "hours": {
      "label": "하루 이상 유효 등록시간",
      "total": 19681,
      "recorded": 4826,
      "missing": 14855,
      "formatPass": 4826,
      "formatReview": 0,
      "recordedPercent": 24.5,
      "definition": "유효한 같은 날 시작·종료 쌍이 하루 이상 있는 기관. 미수록은 휴진 아님"
    }
  },
  "rules": {
    "id_missing_or_malformed": {
      "label": "내부 ID 형식 검토",
      "level": "error",
      "definition": "c-와 12자리 소문자 16진수로 된 내부 ID 형식이 아님.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "duplicate_id": {
      "label": "내부 ID 중복",
      "level": "error",
      "definition": "같은 내부 ID가 두 행 이상에 사용됨. 행을 자동 삭제하거나 병합하지 않음.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "type_mismatch": {
      "label": "종별 코드·명칭 불일치",
      "level": "error",
      "definition": "수록 범위인 41 치과병원 또는 51 치과의원 코드·명칭과 다름.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "name_missing": {
      "label": "기관명 미수록",
      "level": "missing",
      "definition": "기관명 원문이 비어 있음.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "address_missing": {
      "label": "주소 미수록",
      "level": "missing",
      "definition": "주소 원문이 비어 있음. 실제 주소 부재를 뜻하지 않음.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "address_review": {
      "label": "주소 문자 검토",
      "level": "review",
      "definition": "주소에 한글이 없거나 제어 문자가 있음. 우편·도로명 주소의 실재 여부를 검증하는 규칙이 아님.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "phone_missing": {
      "label": "전화 미수록",
      "level": "missing",
      "definition": "신고 전화 원문이 비어 있음. 연락처가 없다는 뜻이 아님.",
      "rows": 72,
      "total": 19681,
      "percentOfTotal": 0.4
    },
    "phone_format_review": {
      "label": "전화 단일 번호 형식 검토",
      "level": "review",
      "definition": "기존 전화 링크 형식 검사에서 단일 번호로 해석되지 않음. 지역번호 생략·복수 번호·메모 등을 포함하며 번호 오류나 연결 불가로 단정하지 않음.",
      "rows": 833,
      "total": 19681,
      "percentOfTotal": 4.2
    },
    "postal_missing": {
      "label": "우편번호 미수록",
      "level": "missing",
      "definition": "우편번호 원문이 비어 있음.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "postal_format_review": {
      "label": "우편번호 형식 검토",
      "level": "review",
      "definition": "5자리 숫자 형식이 아님. 주소와 우편번호의 실제 대응은 확인하지 않음.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "coordinate_missing": {
      "label": "좌표 미수록·일부 수록",
      "level": "missing",
      "definition": "위도 또는 경도 값이 null/undefined임. 0은 누락으로 보지 않음.",
      "rows": 5,
      "total": 19681,
      "percentOfTotal": 0
    },
    "coordinate_range_review": {
      "label": "좌표 숫자·범위 검토",
      "level": "review",
      "definition": "두 값이 유한 숫자가 아니거나 위도 ±90·경도 ±180 범위를 벗어남. 실제 주소의 지오코딩 대조가 아님.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "region_code_review": {
      "label": "지역 코드 형식 검토",
      "level": "review",
      "definition": "시도·시군구 코드 중 하나가 6자리 숫자 문자열이 아님. 현행 행정구역 재분류를 하지 않음.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "website_missing": {
      "label": "신고 홈페이지 미수록",
      "level": "missing",
      "definition": "신고 홈페이지 원문이 비어 있음. 실제 홈페이지 부재를 뜻하지 않음.",
      "rows": 17963,
      "total": 19681,
      "percentOfTotal": 91.3
    },
    "website_format_review": {
      "label": "신고 홈페이지 URL 형식 검토",
      "level": "review",
      "definition": "기존 사이트의 HTTP(S) 주소 구문 검사를 통과하지 않음. 접속·소유·공식성 검사가 아님.",
      "rows": 122,
      "total": 19681,
      "percentOfTotal": 0.6
    },
    "hours_missing": {
      "label": "유효 등록시간 미수록",
      "level": "missing",
      "definition": "월~일 중 유효한 같은 날 시작·종료 쌍이 하루도 없음. 휴진이나 미운영으로 추정하지 않음.",
      "rows": 14855,
      "total": 19681,
      "percentOfTotal": 75.5
    },
    "hours_value_review": {
      "label": "등록시간 값 검토",
      "level": "review",
      "definition": "하나 이상의 요일에 비어 있지 않은 시각 값이 있으나 유효한 같은 날 시작·종료 쌍이 아님.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "source_reference_review": {
      "label": "출처 연결 검토",
      "level": "error",
      "definition": "hira-base가 없거나, 중복·알 수 없는 sourceIds 또는 필요한 상세 출처 연결이 없음.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "doctor_count_review": {
      "label": "의료진 인원 값 검토",
      "level": "review",
      "definition": "등록 총의사수·전문의 수가 알려진 0 이상의 정수가 아님. null과 명시된 0을 구분함.",
      "rows": 0,
      "total": 19681,
      "percentOfTotal": 0
    },
    "same_name_address": {
      "label": "동일 기관명·주소",
      "level": "candidate",
      "definition": "공백과 대소문자만 정리한 기관명과 전체 주소가 같은 서로 다른 ID. 숫자·하이픈·층·호수·괄호는 삭제하지 않음. 중복 확정이 아님.",
      "rows": 4,
      "total": 19681,
      "percentOfTotal": 0
    },
    "same_name_phone": {
      "label": "동일 기관명·단일 전화",
      "level": "candidate",
      "definition": "공백과 대소문자만 정리한 기관명과 형식 검사를 통과한 전화 숫자가 같은 서로 다른 ID. 공동 연락처일 수 있어 중복 확정이 아님.",
      "rows": 6,
      "total": 19681,
      "percentOfTotal": 0
    }
  },
  "regions": {
    "mixedSidoLabels": [
      {
        "code": "360000",
        "labels": [
          {
            "name": "전남",
            "rows": 2
          },
          {
            "name": "전남광주",
            "rows": 1193
          }
        ]
      }
    ],
    "mixedCityLabels": [],
    "limitation": "원자료 코드에 여러 명칭이 연결된 상태만 기록합니다. 현행 행정구역 판정이나 재분류가 아닙니다."
  },
  "provenance": {
    "inputFiles": [
      {
        "file": "data/clinics.json",
        "sha256": "22ca2821563ec5ba0a78d903e55585ad3a0ecd5da4ed12bb28e667b51b05c5fc",
        "bytes": 29871356,
        "status": "read"
      },
      {
        "file": "data/source-manifest.json",
        "sha256": "955508bf41bfd5fcc7668bf71c13097f30b9bd22b75fd5f847a717fc06fc114e",
        "bytes": 5993,
        "status": "read"
      },
      {
        "file": "docs/input-audit.json",
        "sha256": "7e19235062f41da3f7aeafafc2c7c86bd4793e787e6cd63d83d302d9f08c886f",
        "bytes": 13917,
        "status": "read"
      },
      {
        "file": "docs/source-verification-recheck.json",
        "sha256": "b01f7c4351998ae4211ee63babc92668c79f77a4fd8da37208ebfb6d518e20be",
        "bytes": 5508,
        "status": "read"
      },
      {
        "file": "data/content/data-quality-source-evidence.json",
        "sha256": "ef3e9856f55daac90e13c6dff1ef6087697a184c1166d1abc1891753c9942529",
        "bytes": 4452,
        "status": "read"
      }
    ],
    "manifestChecks": [
      {
        "field": "totalClinics",
        "expected": 19681,
        "actual": 19681,
        "status": "match"
      },
      {
        "field": "snapshotDate",
        "expected": "2026-09-30",
        "actual": "2026-09-30",
        "status": "match"
      },
      {
        "field": "name",
        "expected": 19681,
        "actual": 19681,
        "status": "match"
      },
      {
        "field": "address",
        "expected": 19681,
        "actual": 19681,
        "status": "match"
      },
      {
        "field": "phone",
        "expected": 19609,
        "actual": 19609,
        "status": "match"
      },
      {
        "field": "websiteRawNonempty",
        "expected": 1718,
        "actual": 1718,
        "status": "match"
      },
      {
        "field": "website",
        "expected": 1596,
        "actual": 1596,
        "status": "match"
      },
      {
        "field": "hoursAvailable",
        "expected": 4826,
        "actual": 4826,
        "status": "match"
      },
      {
        "field": "coordinates",
        "expected": 19676,
        "actual": 19676,
        "status": "match"
      },
      {
        "field": "type.41",
        "expected": 248,
        "actual": 248,
        "status": "match"
      },
      {
        "field": "type.51",
        "expected": 19433,
        "actual": 19433,
        "status": "match"
      }
    ],
    "sourceCatalogIssues": [],
    "snapshotDateValid": true,
    "currentBytesMatchPriorImport": true,
    "priorImportCheckedAt": "2026-10-31T14:00:41.863046+00:00",
    "priorOfficialSnapshotMatched": true,
    "priorOfficialCheckedAt": "2026-10-31T14:21:36.738406+00:00",
    "archiveSha256": "ceff684b8eb1dc9059b668ec56bc91d2a643997420733b2996a0bc5d8910f9c3",
    "linkedHistoricalSourceCheck": true,
    "officialEvidence": {
      "schemaVersion": 1,
      "checkedAt": "2026-11-02T03:50:26Z",
      "method": "Official catalog checked with web.open; two duplicate-candidate groups followed through primary sources. One clinic homepage was directly read with a normal unauthenticated HTTPS request following its HTTP redirect after the web reader timed out. No login, API key, telephone call, or source-data edit.",
      "catalog": {
        "url": "https://www.data.go.kr/catalog/15051059/fileData.json",
        "landingUrl": "https://www.data.go.kr/data/15051059/fileData.do",
        "status": "directly_read",
        "publisher": "건강보험심사평가원",
        "datasetName": "건강보험심사평가원_전국 병의원 및 약국 현황_20260930",
        "snapshotDate": "2026-09-30",
        "dateModified": "2026-10-20",
        "updateFrequency": "분기",
        "finding": "공식 카탈로그에서 분기별 API 추출 자료이며 추출일에 따라 월말 집계와 차이가 날 수 있다는 설명을 확인했다. 이번 확인은 ZIP 재다운로드나 모든 기관의 현재 상태 확인이 아니다.",
        "landingPageAccess": "web.open failed with unsupported content-type; the separate official catalog URL was readable"
      },
      "institutionSamples": [
        {
          "name": "인천센터치과의원",
          "clinicIds": [
            "c-6e876b132d73",
            "c-91289ed8f36c"
          ],
          "checkedAt": "2026-11-02T03:50:26Z",
          "sourceUrl": "http://www.icenterdental.co.kr/",
          "requestedUrl": "https://www.icenterdental.co.kr/",
          "sourceKind": "institution_homepage",
          "status": "body_read_partial_concordance",
          "statusLabel": "기관 홈페이지 본문 직접 확인 · 일부 표기 차이",
          "httpStatus": 200,
          "bodySha256": "bd7315e61cbbd1dfe0ca1e81ee59d9981e9ea82bc04e4350d120360460db26c0",
          "observed": {
            "name": "인천센터치과의원",
            "address": "인천광역시 서구 가정로 280 (JS노송병원 6층)",
            "phone": "032-577-2870"
          },
          "result": "홈페이지의 기관명·가정로 280·6층 및 전화 뒤 7자리는 두 등록 행과 대응한다. 원자료 전화는 577-2870으로 지역번호가 생략되어 있고, 주소의 구 명칭은 원자료 서해구와 홈페이지 서구가 다르다.",
          "limitation": "홈페이지의 자체 안내를 읽은 결과다. 두 내부 ID 중 어느 기록을 채택해야 하는지, 현행 행정구역 표기, 실제 전화 연결, 현재 영업·이전·폐업은 확정하지 않았다. 원본 두 행과 연락처를 수정하거나 병합하지 않았다.",
          "searchQuery": "\"인천센터치과의원\" 공식 홈페이지",
          "accessAttempts": [
            {
              "url": "https://www.icenterdental.co.kr/",
              "method": "web.open",
              "result": "timeout"
            },
            {
              "url": "https://icenterdental.co.kr/",
              "method": "web.open",
              "result": "timeout"
            },
            {
              "url": "https://www.icenterdental.co.kr/",
              "method": "Python urllib standard GET; normal redirect followed",
              "result": "HTTP 200 at http://www.icenterdental.co.kr/; visible contact text read"
            }
          ]
        },
        {
          "name": "오혜명시온백년치과의원",
          "clinicIds": [
            "c-6174692428a4",
            "c-6d609384cfd5"
          ],
          "checkedAt": "2026-11-02T03:50:26Z",
          "sourceUrl": "https://www.hira.or.kr/ra/hosp/hospInfoAjax.do?ykiho=JDQ4MTYyMiM4MSMkMSMkMCMkNzIkMzgxOTYxIzIxIyQxIyQxIyQ5OSQzNjE0ODEjNTEjJDEjJDIjJDgz",
          "sourceKind": "official_hira_institution_page",
          "status": "direct_page_unavailable",
          "statusLabel": "공식 기관 페이지의 현재 본문 미확인",
          "result": "검색에서 심평원 기관 페이지를 찾았으나 직접 열기 결과에는 병원정보가 존재하지 않는다는 제목만 표시되고 읽을 수 있는 본문이 없었다. 검색 결과의 과거 요약을 현재 사실로 채택하지 않았다.",
          "limitation": "페이지를 열지 못한 이유를 확인하지 못했으므로 폐업·이전·ID 변경 또는 중복 여부를 추정하지 않는다. 중복 의심 두 행은 그대로 유지한다.",
          "searchQuery": "\"오혜명시온백년치과의원\" site:hira.or.kr",
          "searchSnippetUsedAsCurrentEvidence": false
        }
      ],
      "overallLimit": "기관 홈페이지 본문 관찰 1건과 공식 기관 페이지 열람 실패 1건을 전국 검증 완료로 일반화하지 않는다. 공식 분기 원본의 과거 해시·필드 대조와 이번 제한적 원문 관찰은 서로 다른 검증 범위다."
    },
    "meaning": "현재 가공 파일의 SHA-256을 이전 독립 재가공 기록에 연결하고, 그 원본 ZIP의 과거 공식 다운로드 대조 기록을 구분해 표시합니다. 이번 로컬 점검이 새 원본 다운로드나 기관별 현재 사실 검증을 뜻하지 않습니다."
  },
  "duplicates": {
    "candidateGroups": [
      {
        "kinds": [
          "same_name_address",
          "same_name_phone"
        ],
        "records": [
          {
            "row": 7512,
            "id": "c-6174692428a4",
            "name": "오혜명시온백년치과의원",
            "address": "경상북도 구미시 구미대로 389, (신평동)",
            "phone": "054-461-2877"
          },
          {
            "row": 8439,
            "id": "c-6d609384cfd5",
            "name": "오혜명시온백년치과의원",
            "address": "경상북도 구미시 구미대로 389, (신평동)",
            "phone": "054-461-2877"
          }
        ]
      },
      {
        "kinds": [
          "same_name_address"
        ],
        "records": [
          {
            "row": 8536,
            "id": "c-6e876b132d73",
            "name": "인천센터치과의원",
            "address": "인천광역시 서해구 가정로 280, 노송병원 6층 601 일부호, 602호 (석남동)",
            "phone": "577-2870"
          },
          {
            "row": 11099,
            "id": "c-91289ed8f36c",
            "name": "인천센터치과의원",
            "address": "인천광역시 서해구 가정로 280, 노송병원 6층 601 일부호, 602호 (석남동)",
            "phone": "577-2870"
          }
        ]
      },
      {
        "kinds": [
          "same_name_phone"
        ],
        "records": [
          {
            "row": 9615,
            "id": "c-7cd315a2c492",
            "name": "해바라기치과의원",
            "address": "전남광주통합특별시 광산구 하남대로 282, (운남동)",
            "phone": "062-956-2272"
          },
          {
            "row": 19273,
            "id": "c-fa8ce7c26153",
            "name": "해바라기치과의원",
            "address": "전남광주통합특별시 광산구 하남대로 282, 2층 (운남동)",
            "phone": "062-956-2272"
          }
        ]
      },
      {
        "kinds": [
          "same_name_phone"
        ],
        "records": [
          {
            "row": 14565,
            "id": "c-bd68079b210e",
            "name": "이편한치과의원",
            "address": "부산광역시 부산진구 중앙대로 921, 전원빌딩 7층 (양정동)",
            "phone": "051-868-2875"
          },
          {
            "row": 15143,
            "id": "c-c5c92011e319",
            "name": "이편한치과의원",
            "address": "부산광역시 부산진구 중앙대로 921, (양정동)",
            "phone": "051-868-2875"
          }
        ]
      }
    ],
    "limitation": "공유 전화·주소는 참고 묶음이며 중복 후보 수에 직접 합산하지 않습니다. 동일 이름만으로는 후보를 생성하지 않습니다."
  }
}
