그럴듯한 화면과 옳은 계산은
다른 문제입니다

엔진이 지켜야 할 성질을 실제 데이터로 걸어 본 결과입니다. 통과한 것만 골라 싣지 않습니다. 실패가 있으면 실패로 적습니다. 같은 자료로 다시 돌리면 같은 결과가 나옵니다 — 무작위가 섞이지 않습니다.

35
통과
전체 38건 = 불변식 31 + 역검증 2(참고) + 성능 3 + 신선도 2(참고)
0
실패
없음
2026-09-04 00:21
실행 시각
소요 2.6초
43,728
검사 대상
도로 링크 · 노드 34,598

불변식

어떤 입력에도 성립해야 하는 성질. 하나라도 깨지면 그 답은 못 믿는다

✓
같은 입력에 같은 답
출발지 6곳 재계산 — 일치 6곳 · 최대 차이 0.000000초
무작위가 섞이면 보고서와 화면이 다른 값을 낼 수 있고, 재현·감사가 불가능해진다
✓
위험가중을 켜면 위험 노출이 늘지 않는다
표본 4건 모두 성립
비용함수가 위험을 제대로 벌하고 있는지를 직접 확인한다
✓
통제 구간을 지나는 경로가 하나도 없다
통제 2개소(엣지 14) · 경로 24건 검사 · 위반 0건
통제된 지하차도로 안내하면 이 서비스는 존재 이유를 잃는다
✓
견딜 수 없는 침수 구간으로 안내하지 않는다
경로 26건 검사 · 위반 0건
휠체어 이용자에게 허용치를 넘는 구간을 안내하면 그 안내는 위험 그 자체가 된다
✓
표고모델이 해상하는 급경사로는 안내하지 않는다
경로 26건 중 경사 상한이 걸린 11건 검사 · 90m 이상 구간 위반 0건
휠체어 이용자에게 5%를 넘는 비탈을 안내하면 그 경로는 존재하지 않는 경로다
✓
갈 수 없는 거리의 대피소를 권하지 않는다
답 29건 검사 · 상한 초과 0건
고령자에게 1.2km 를 넘는 곳을 권하면 그 안내는 실행되지 않는다
✓
취약지 격자와 상황판이 같은 답을 낸다
표본 3칸 모두 일치
예방 지도와 대응 화면이 다른 규칙으로 계산되면 둘 중 하나는 반드시 틀린 것이다
✓
대피 주체에 맞는 사람을 센다
65세 이상 38,557명 (공표 40,848명 대비 5.6%) · 심한장애 4,216명 (공표 4,315명 대비 2.3%)
고령자 조건으로 계산하고 전 주민을 세면 숫자는 그럴듯해도 가리키는 대상이 다르다
✓
재난 신호가 없으면 아무 곳도 닫지 않는다
평시 상황 통제 0개소
무차별로 닫는 규칙은 규칙이 아니다. 닫지 않는 경우가 있어야 판정이라 부를 수 있다
✓
차량이 출발하지 못하는 지점이 없다
도로 200m 이내 표본 1,536개 · 차량 출발 불가 0개
보행로 노드에 붙으면 차량은 한 발도 못 나가 전 후보가 경로 없음이 된다. 차가 갈 곳이 없다는 뜻이 아니라 엔진이 못 찾는 것이다
✓
가정 시나리오가 이 지역 관측소를 가리킨다
수계 묶음 4개 · 관측소 6개소 전부 그래프에 있고 빠진 관측소 없음 · 프리셋 4개 묶음 참조 정상
묶음이 다른 지역 관측소 코드를 들고 있으면 프리셋을 눌러도 아무 단계가 만들어지지 않는다. 화면은 오류 없이 「위험 신호 없음」을 낸다
✓
모든 관측소가 판정 기준을 가진다
관측소 6개소 전부 임계 보유(잠정치 포함)
임계가 없는 관측소는 수위가 아무리 올라도 단계가 만들어지지 않는다. 화면에는 관측소로 보이지만 판정에는 참여하지 않는 상태다
✓
공표 기준수위를 쓰는 관측소 수가 화면 문구와 같다
공표 2개소(거제시(덕포2교) · 거제시(독봉교)) · 잠정 4개소(거제시(연초댐) · 거제시(죽전교) · 거제시(구천댐) · 거제시(구천교))
「공표가 없다」는 서사는 조회처를 잘못 물어도 똑같이 만들어진다. 몇 곳이 공표인지를 검사가 세어야 문구가 혼자 늙지 않는다
✓
관측 연계 없는·임계 없는 구간이 위험 0으로 취급되지 않는다
관측 연계 없는 지상 도로 31,823개 · 임계 없는 관측소 연계 0개(전 관측소 임계 보유) — 가정 호우에서 각각 위험>0 14,882개(46.8%) · 0개(0.0%) · 통제 0개
기준 관측소가 없거나 임계수위가 미확보라고 안전하다는 뜻이 아니다. 지형과 강우로라도 위험을 잡아야 하고, 반대로 그 어떤 구간도 근거 없이 통제되어서는 안 된다
✓
상황보고서 읍면동 표가 실제로 채워진다
읍면동 18개 — 인구 18 · 자력대피불가 18 · 대피소 배정 합계 122(선언 122)
인구·대피소·도달불가가 각각 다른 파일에서 온다. 하나라도 이름이 어긋나면 표는 빈 칸으로 인쇄되고, 그 표가 조치 대상을 고르는 근거다
✓
3D 트윈 자료가 같은 격자를 쓴다
격자 667×595 = 396,865칸 · 다섯 자료 길이 일치
지형·침수·하상·구역·관측소가 각각 다른 파일이다. 한 장이라도 크기가 어긋나면 화면은 그려지되 엉뚱한 자리가 잠긴다
✓
비가 오지 않으면 트윈에 물이 차지 않는다
수위 0m 에서 잠긴 격자 13 / 관측 유역 12,105 (0.11%)
관측소 수면표고를 하류까지 그대로 밀면 강바닥이 낮아지는 만큼 도심이 상시로 잠겨 보인다. 그 그림에서는 사건이 만든 차이를 읽을 수 없다
✓
모든 모드에서 강우가 위험에 반영된다
7개 모드 전부 강우에서 계산한 값과 일치 · 사건 첨두 부하 1.00(1시간 86.0mm)
강우부하를 모드마다 손으로 적으면 한 곳에서 빠뜨려도 화면은 멀쩡하다. 비가 오는데 위험만 0 인 상태는 숫자를 나란히 놓아야 보인다
✓
우량계가 비어도 초단기실황이 위험을 올린다
우량계 결측·실황 45mm → 부하 1.00 · 우량계 10mm 와 함께면 1.00
거제 우량계는 원자료가 공백인 시간이 있다. 표시만 하고 계산에서 빼면 「관측이 없다」가 「비가 안 온다」로 읽힌다
✓
강우가 지상도로 위험을 실제로 바꾼다
표본 804개 지상도로 중 1시간 45mm 로 위험이 오른 구간 385 (47.9%)
부하를 계산해 두고 쓰지 않으면 값은 맞고 결과는 안 변한다. 하천이 전부 안전한 상태에서 비만 넣어 걸어 본다
✓
예보가 비어 있으면 「사유 없음」에 그 사실을 적는다
12시간 예보 중 3시간 결측 — 결측 계수 3(온전한 예보는 0) · 판정 사전 통제 사유 없음 · 문장에 하한 명시 있음 · 3시간 최대 45.0mm (호우주의보 60mm)
빈 시간을 0mm 로 더하면 누적이 하한이 된다. 그 하한이 기준에 못 미쳤다는 이유로 통제 사유 없음을 내면, 자료 결손이 「비가 오지 않는다」로 읽힌다
✓
우량 결측을 0mm 로 적지 않는다
일누적 차분으로 되찾음 일치(2026-08-17 03시 262.0−145.2=116.8) · 앞 시각 없으면 결측 유지 예 · 00시 차분 제외 예
이 지점은 비가 그치면 1시간 강수를 0.0 이 아니라 -9 로 낸다. -9 를 0 으로 옮겨 적으면 진짜 결측까지 「비 안 옴」이 되고, 결손이 안전한 쪽으로 인쇄된다
✓
강수 항목이 빠진 발표분을 성공으로 받지 않는다
기온만 든 발표분 거부 예 · 강수 든 발표분 채택 예 · 빈 발표분 거부 예
기상청은 강수 항목이 통째로 빠진 반쪽 발표분을 정상 응답으로 내려보낸다. 개수만 보고 받으면 멀쩡한 앞 발표분으로 물러나지 않는다 — 「비어 있지 않다」와 「쓸 수 있다」는 다르다
✓
제공 중인 초단기 발표분을 건너뛰지 않는다
19:57 → 1930(제공 중) · 19:40 → 1830(제공 전이라 앞 발표분)
지난 발표분은 곧 사라진다. 제공 시작을 지나치게 오래 기다리면 이미 사라진 발표분만 조르게 되고, 물러날 곳도 전부 만료라 예보가 통째로 없어진다
✓
관측을 못 받은 지하차도를 「안전」으로 그리지 않는다
지하차도 엣지 14개 — 결측 시 안전 아님 14 · 막지 않음 14 · 사유에 판정 보류 있음 · 재난정보 미반영 대조군은 그대로 안전 예
수위를 못 받았다는 것은 안전하다는 뜻이 아니다. 결측을 안전으로 두면 통제가 조용히 풀린다. 다만 모른다는 이유로 길을 막지도 않는다 — 표시는 판정 보류로 남기고 현장 확인에 넘긴다
✓
재지 못한 하천을 「정상」이라고 브리핑하지 않는다
결측 6/6개소 · 판정 보류 지하차도 2개 · 정상 단언 없음 · 보류 명시 있음 · 실측 대조군 정상 예 · 가정 「안전」을 보류로 적지 않음 예
관측값을 받지 못하면 위험 목록이 비는데, 그 빈 목록을 근거로 「전 지점 정상」이라고 적으면 관측하지 않은 사실을 단언하는 것이 된다. 대피 판단의 첫 문장이 그렇게 나가서는 안 된다
✓
대피소 선언 통계는 목록에서 다시 센 값과 같다
선언 122개소 · 19,565명 — 재계산 122개소 · 19,565명 · 수용률 8.6%
생산자와 소비자의 세는 규칙이 어긋나면 폐쇄된 시설을 쓰는 셈이다
✓
통제 대상 지하차도가 등록대장과 같은 개수다
그래프 2개소(장평지하차도, 코아루앞지하차도) · 국토교통 등록 2개소
남의 시군 것이 섞이거나 관내 것이 빠지면 통제 판정의 전제가 통째로 흔들린다
✓
침수예상구역에 걸린 대피소가 기준선마다 화면 자료까지 실려 간다
기준선 2/2개 · river200 안 4·경계밖 11 · city100 안 2·경계밖 12 · 합계 6개소 · 목록 일치
대조 파일이 빠지거나 기준선 한쪽이 비면 화면은 오류 없이 그만큼을 감춘다. 하천 범람과 도심 내수는 걸리는 시설이 서로 달라서, 한쪽을 잃으면 절반을 놓친다
✓
걸린 대피소는 이름·예상 침수심·경계까지 거리를 함께 남긴다
수양동주민센터(2~5m·경계 27m) · 동부면 주민자치센터(참살이센터)(1~2m·경계 38m) · 수월초등학교(0.5~1m·경계 29m) · 수월중학교(0.5m 이하·경계 13m) · 신현초등학교(0.5m 이하·경계 4m) · 서문경로당(0.5m 이하·경계 1m)
개수만으로는 조치할 수 없다. 어느 시설이 몇 미터 잠기는지, 그리고 그 판정이 좌표 오차 안쪽인지가 있어야 현장 확인 대상을 정한다
✓
강우를 못 받은 것과 강수가 없는 것을 구분해 말한다
6가지 문구 판정 일치 — 「강수 미보고」는 출처가 덧붙어도 결측으로 알아봄
전문은 정상인데 강수 항목만 결측인 날이 훨씬 흔하다. 그것을 「조회 실패」라 적으면 멀쩡한 화면이 고장으로 읽히고, 진짜 장애의 경고가 묻힌다

역검증

과거에 실제로 있었던 재난에 규칙을 그대로 걸어 본 결과

·
사건마다 다르게 반응한다
사례 1건 · 도달 단계 종류 1종 (심각) — 관측소 6개소가 2026-02 신설이라 그 이전 사건은 재현할 자료가 없음(판정 보류)
모든 사건에서 똑같이 반응하면 그것은 판정이 아니라 상수다
✓
2026.8 거제 극한호우 — 독봉교 심각단계 도달을 실측으로 재현
고현천 독봉교 2026.08.17 01시 심각 도달 · 첨두(17일 02시, 3.83m) 1시간 전
공표 기준수위가 없는 지역에서도 이력 기반 잠정치로 같은 판정 구조가 동작함을 확인한다

성능

계산 자체에 걸리는 시간. 검사를 돌린 기기 기준이며 서버 응답시간과는 다르다

✓
경로 1건 계산 시간
표본 72건 · 중앙값 0.0ms · p95 0.1ms
재난 상황에서 몇 초씩 기다리는 화면은 쓰이지 않는다
✓
대피 계획 1회(후보 전수 + 대조군)
25ms — 후보마다 최소위험경로와 최단경로를 각각 계산한 값
화면이 한 번에 내놓는 답 전체를 만드는 데 걸리는 시간
✓
도달권 1회(역방향 전수 탐색)
4ms · 대피소 12개소 기준
취약지 지도를 다시 만드는 데 드는 비용. 사전 계산이라 화면에서는 기다리지 않는다

신선도

어느 시점 자료로 계산한 결과인가

·
표고모델이 해상하지 못한 급구간을 감추지 않는다
경사 상한이 있는 경로 11건 중 6건이 90m 미만 급구간을 지난다 · 그중 최대 경사 14% — 통제 대신 통행시간을 늘려 반영하고 현장 확인 대상으로 표시함
90m 격자는 그보다 짧은 길의 경사를 담지 못한다. 막지 않기로 한 이상, 몇 건인지는 밝혀야 한다
·
계산에 쓴 자료의 생성 시점
도로망 그래프 2026-08-28 · 대피시설 2026-08-28 · 기준수위 2026-08-30 · 주민등록 인구 2026-08-26 · 행정경계 2026-08-28 · 취약지 격자 2026-08-28
언제 자료로 계산한 결과인지 모르면 그 숫자는 근거가 되지 못한다

역검증 상세

같은 규칙을 실제 재난의 실측값에 그대로 걸었을 때 그날 무엇이 나왔는가

재난수위 첨두통제 판정확보한 선행시간
2026.8 거제 극한호우2026081702 · 3.83m장평 · 코아루앞장평 1시간 · 코아루앞 1시간

거제시의 통제 대상 지하차도는 장평동의 장평지하차도·코아루앞지하차도 2개소입니다. 둘 다 OSM 에는 지하차도로 태깅되어 있지 않아, 국토교통부 등록대장 폴리곤과 도로망을 대조해 잡았습니다. 수위 관측소 6개소는 2026년 2월 신설이라 그 이전 사건은 재현할 수 없고, 대조군은 같은 해의 평시 구간입니다. 규칙이 비만 오면 닫는 것이 아니라는 것을 보이려면 닫히지 않는 사례가 있어야 합니다. 선행시간의 기준은 실제 침수 시각이 공개된 경우 그 시각, 아니면 그 관측소의 수위 첨두입니다.

운영에 드는 비용

현재 구성 그대로의 값. 모르는 것은 모른다고 적습니다

호스팅Vercel — 현재 이용량에서는 무료 구간실측
하천 수위·강우WAMIS — 공개 조회. 호출 비용 0원실측
기준수위(공표)낙동강홍수통제소 홍수특보 기준수위 — 공개 조회. 비용 0원 — 관측소 6곳 중 2곳실측
기준수위(잠정)WAMIS 시수위 이력 재산출 — 미공표 4곳 — 백분위 파생. 비용 0원파생
대피시설·인구행정안전부 공공데이터 — 생활안전지도·주민등록 통계. 비용 0원실측
도로망·행정경계OpenStreetMap · 행정안전부 admdongkor — 출처 표기 조건. 비용 0원실측
경사(링크)국토지리정보원 수치표고모델 DEM 90m — 공표 수치지형자료 — 보행 경사 상한 판정. 비용 0원실측
표고·저지대Copernicus DEM GLO-30 — 공개 라이선스. 저지대지수 파생에 사용. 비용 0원파생
지도 표시카카오맵 — 무료 사용량 범위 내. 초과하면 유료 전환 필요확인 필요
AI 브리핑DeepSeek — 상황 1건당 약 1,000토큰. AI 가 멈춰도 규칙 기반으로 같은 브리핑이 나옴실측

수위·강우·기준수위처럼 판단을 좌우하는 신호는 모두 공개 자료로 확보합니다. 외부 계약이 끊겨 서비스가 멈추는 구조가 아닙니다.

다음 사람이 이어받을 수 있는가

한 사람만 아는 절차가 남아 있으면 그것은 제품이 아닙니다

데이터 적재8단계 자동 처리수집부터 도로망 구축까지 사람 손이 들어가는 단계가 없습니다
다른 도시 적용대피시설·관측소 자료 교체같은 절차를 그대로 돌리면 그 도시의 취약지 격자가 만들어집니다
검증배포 전 자동 검사이 페이지의 숫자를 만드는 검사입니다. 하나라도 실패하면 배포가 멈춥니다
사건 추가실측 이력 등록관측 이력이 있는 재난은 한 건 등록으로 사례가 늘어납니다
판정 규칙한 곳에서만 정합니다통제 구간과 구간 위험도의 기준이 한 곳에 있어, 화면·보고서·격자가 같은 답을 냅니다

이 검사가 실제로 잡아낸 것

「갈 수 없는 거리의 대피소를 권하지 않는다」 검사가 처음 실행에서 실패했습니다. 대피소 후보를 직선거리로 골라 놓고 실제 보행거리는 확인하지 않아, 「최대 이동거리 2,500m」 라고 적어 두고 2,795m 를 걷게 하는 안내가 나오고 있었습니다. 같은 이유로 예방 화면의 취약지 격자와 대응 화면의 판정이 한 칸에서 어긋났습니다. 경로 탐색에 이동거리 상한을 넣어 두 화면이 같은 규칙을 쓰도록 고쳤고, 지금은 두 검사 모두 통과합니다.

화면만 보고는 알 수 없는 종류의 결함입니다. 검사를 만들지 않았다면 그대로 남았을 것입니다.

통과한 검사만 골라 싣지 않는다. 실패가 있으면 실패로 적고 그대로 공개한다. 성능은 이 스크립트를 돌린 기기 기준이며 서버 응답시간과는 다르다. 검사 표본 출발지 — 거제시청(고현동) · 옥포2동(산사태 발생지 인근) · 장평동(장평지하차도·고현천변) · 연초면 오비리(고립 구조 지점) · 둔덕면(서부 농촌) · 하청면 칠천도(연륙 부속섬).