move_detect/docs/deck/deck.json
유창욱 93f896af87 fix(audit): 1.2.0 4차 재감사 — 확정 23건 전량 해소
4개 관점 병렬 감사 후 각 발견을 반증 시도해 확정. 반증 5건은 문서에 남겼다.

이번 감사의 요지: **구현도 단위테스트도 초록인데 납품 경로에서 동작하지 않는**
결함이 셋 있었다. 전부 같은 모양이다 — 테스트가 기본값이 아닌 설정을 썼거나,
값이 존재해도 되는지 결정하는 상류 허용 목록을 보지 않았다.

CRITICAL 4건:

R4-1 추락 승격이 기본 설정에서 한 번도 발화하지 않았다. link_s(3.0)를 now
기준으로 쟀는데 넘어짐은 prone_confirm_s(3.0) 지속 후 확정되므로 확정 시점에는
항상 3초 넘게 지나 있다. 다른 테스트가 전부 prone_confirm_s=0.5 를 써서
초록이었다. 착지(prone 시작) 시각과 비교하도록 고치고, 기본값 그대로 도는
회귀 테스트를 넣었다.

R4-2 max_workers:0 이 상류 두 곳에서 막혀 있었다 — 서버 규칙 경계가 [1,50]
이라 저장이 400 이고, 엣지 파서가 v<=0 으로 규칙 전체를 무효화해 같이 넣은
2인1조까지 사라졌다. 앞 커밋에서 고친 네 곳은 전부 이 둘보다 하류라 도달
불가였다.

R4-3 고소작업 프리셋(elevated)이 완전히 무동작이었다. 서버 경계에 키가 없어
400, 통과해도 엣지 파서가 침묵 삭제. 프리셋 안내문과 커밋 메시지가 시스템이
하지 않는 일을 약속하고 있었다.

R4-4 동시 다발이 한 사람을 두 명으로 셀 수 있었다. 트래커는 1초 가려짐에
트랙을 버리고 새 id 를 주고(max_age=1.0) 누운 사람은 새 트랙에서도 즉시
prone 이라 두 번째 fall 이 난다. 그러면 다친 한 사람에게 "공기호흡기 없이
진입 금지"가 나가 구조가 늦어진다 — 기능의 가치가 정반대로 뒤집힌다.
ghost 를 인원 집계에서 빼고, 거의 같은 자리의 사건은 같은 사람으로 본다.

HIGH 5건: 구역 그룹핑 사문화(엣지가 zone_id 를 안 실어 카메라가 다른 두
희생자가 절대 안 묶였다 — 밀폐공간이 정확히 그 상황), 창 미끄러짐으로 한
사고가 매 분 새 위급 건으로 쏟아지고 인원이 줄면 앞선 알림을 스스로 뒤집던
문제, 무장 미만료·forget 누락·이중 발보, 업그레이드 안내의 마이그레이션 2개
누락(신규 유형 INSERT 가 전부 DB CHECK 에 걸린다), BUILD-INFO 커밋 스탬프.

BUILD-INFO 는 1.1.0 에서 고친 R3-6 의 재발이다. 절차로 막으려다 두 번
실패했으므로 HEAD 일치를 검사하는 테스트로 막았다. README 마이그레이션
목록도 같은 이유로 테스트를 붙였다.

MEDIUM 14건 중 눈에 띄는 것: 정비 억제가 SCBA 경고를 삼켰고(허가가 발급된
그 구역·그 시간이 질식이 일어나는 자리다) 위급 3종을 억제 예외로 뺐다.
데모 시더 심각도가 제품과 7종 어긋나 fall 이 위급으로 찍혀 1.2.0 의 요점인
넘어짐/추락 구분이 데모에서 지워져 있었다 — 라벨과 달리 화면이 안 깨져
눈으로는 못 잡으므로 엣지를 단일 출처로 강제하는 테스트를 붙였다.
문서의 "17종"은 실제 20종(엣지 16 + 서버 4)으로 정정하고 신규 2종을
소개서 감지 표에 넣었다.

검증: pytest 335 passed / phpunit 269 passed. 신규 테스트 30건.
dist 는 이 커밋 이후 재생성한다(BUILD-INFO 가 HEAD 를 가리켜야 한다).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EBjuR7DW6PNNMows4KnbYU
2026-09-05 23:11:57 +09:00

203 lines
No EOL
9.7 KiB
JSON

{
"title": "작업장 안전 AI CCTV",
"subtitle": "쓰러진 사람을 3초 안에 알아채고, 경광등을 울리고, 증거를 남깁니다",
"audience": "경영진 보고",
"slides": [
{
"kind": "cover",
"image": "01-현장-설치.jpg",
"eyebrow": "제품 보고",
"title": "작업장 안전 AI CCTV",
"lead": "쓰러진 사람을 3초 안에 알아채고, 경광등을 울리고, 증거를 남깁니다.",
"foot": "감지 · 대응 · 증거 — 셋이 한 사슬로 묶인 시스템"
},
{
"kind": "statement",
"eyebrow": "문제",
"title": "CCTV는 이미 있습니다.<br>그런데 왜 사고를 못 막습니까.",
"columns": [
{
"head": "아무도 안 보고 있다",
"body": "카메라 수십 대를 사람이 실시간으로 볼 수는 없습니다. 화면은 사고가 난 뒤에 되감기 위한 것이 됩니다."
},
{
"head": "알아도 알릴 방법이 없다",
"body": "설령 감지해도 화면에만 뜨면 그것은 기록 장치입니다. 새벽 3시에 넘어진 사람은 아침까지 그대로입니다."
},
{
"head": "나중에 설명할 수 없다",
"body": "사고 조사에서 필요한 것은 영상이 아니라 시각·조치·통보의 기록인데, 그 기록이 남지 않습니다."
}
]
},
{
"kind": "figure",
"eyebrow": "해결 구조",
"title": "하나의 사슬입니다",
"image": "05-사슬.png",
"note": "어느 한 칸이 비면 나머지가 무의미해집니다. 감지만 있으면 아무도 모르고, 대응만 있으면 나중에 설명할 수 없습니다."
},
{
"kind": "clip",
"eyebrow": "핵심 시연",
"title": "쓰러지면, 경광등이 켜집니다",
"clip": "v01-넘어짐-경광등.mp4",
"poster": "02-경광등.jpg",
"caption": "쓰러진 자세가 3초 지속되면 확정. 감지한 노드가 자기 GPIO로 직접 울립니다.",
"points": [
"서버도 인터넷도 거치지 않습니다 — 회선이 끊겨도, 서버가 죽어도 울립니다",
"10초 넘게 움직임이 없으면 최상위 위급으로 스스로 올라갑니다",
"1분 안에 담당자에게, 5분 안에 확인되지 않으면 상위 담당자에게"
]
},
{
"kind": "figure",
"eyebrow": "판정 근거",
"title": "언제 감지되는지 설명할 수 있습니다",
"image": "08-넘어짐-감지-시퀀스.jpg",
"note": "한 프레임 보고 놀라서 울리는 것이 아니라, 자세가 지속되는지를 초 단위로 확인하고 단계적으로 올립니다. 도중에 일어서면 알람 없이 니어미스로만 기록됩니다 — 사고 전 신호가 통계로 쌓입니다."
},
{
"kind": "compare",
"eyebrow": "가장 많이 받는 질문",
"title": "앉으면 오탐이 나지 않습니까",
"left": {
"label": "울리지 않음",
"tone": "ok",
"clip": "v02-앉기-정상.mp4",
"poster": "09-앉기-vs-넘어짐.jpg",
"body": "쭈그려 앉거나 허리를 굽힌 자세는 세로가 여전히 깁니다."
},
"right": {
"label": "울림",
"tone": "alarm",
"clip": "v01-넘어짐-경광등.mp4",
"poster": "08-넘어짐-감지-시퀀스.jpg",
"body": "가로가 세로보다 넓어진 상태가 3초 이상 지속될 때만 확정합니다."
},
"note": "그래도 오탐은 납니다. 화면에서 오탐 표시 한 번이면 통계에서 빠지고, 감도 조정의 근거가 됩니다. 오탐율은 화면에 그대로 표시됩니다.",
"fallback": "09-앉기-vs-넘어짐.jpg"
},
{
"kind": "clip",
"eyebrow": "구역 규칙",
"title": "위험구역은 화면 위에 직접 그립니다",
"clip": "v04-구역진입.mp4",
"poster": "10-위험구역-판정.jpg",
"caption": "판정 기준은 발 위치입니다. 구역 안에 0.75초 이상 머물면 이벤트가 남습니다.",
"points": [
"경고 · 제한 · 협착 3단계로 위험도를 나눠 지정합니다",
"2인 1조 구역에 혼자 남으면 30초 뒤 사건이 됩니다",
"정원 초과 · 장시간 체류도 같은 방식으로 규칙화됩니다"
]
},
{
"kind": "clip",
"eyebrow": "차별점",
"title": "감시 장비 자신의 고장도 신고합니다",
"clip": "v05-카메라-건드림.mp4",
"poster": "01-현장-설치.jpg",
"caption": "청소하다 카메라를 스치면 위험구역이 엉뚱한 바닥을 가리킵니다. 그런데 프레임은 계속 들어오고 화면은 정상으로 보입니다.",
"points": [
"화각 변경 · 렌즈 가림 · 조도 저하를 스스로 감지합니다",
"노드가 응답을 멈추면 서버가 하트비트의 부재로 판정합니다",
"\"아무도 확인하지 않았다\"는 사실 자체도 사건으로 기록됩니다"
],
"kicker": "이것이 이 제품의 조용한 실패 방어선입니다. 대부분의 감시 시스템은 자기가 멈춘 것을 모릅니다."
},
{
"kind": "figure",
"eyebrow": "기대효과",
"title": "달라지는 것은 발견까지 걸리는 시간입니다",
"image": "07-대응시간.png",
"note": "사고를 없애지는 못합니다. 발견과 대응이 빨라질 뿐입니다 — 그런데 쓰러진 사람에게는 그 차이가 결과를 바꿉니다."
},
{
"kind": "metrics",
"eyebrow": "기대효과",
"title": "효과는 저희가 주장하지 않습니다.<br>시스템이 스스로 측정해 보여줍니다",
"items": [
{
"head": "평균 대응시간",
"body": "감지에서 확인까지 걸린 시간. 개선 활동의 성패가 이 숫자 하나로 드러납니다."
},
{
"head": "니어미스 : 사고 비율",
"body": "넘어질 뻔한 횟수가 쌓입니다. 사고가 나기 전에 어디가 위험한지 보입니다."
},
{
"head": "조치 전후 감지 밀도",
"body": "안전 조치를 한 구역에서 이벤트가 실제로 줄었는지 히트맵으로 비교합니다."
},
{
"head": "오탐율",
"body": "숨기지 않고 화면에 표시합니다. 신뢰할 수 있는 시스템인지 스스로 증명하게 합니다."
}
],
"note": "공급자의 ROI 추정이 아니라 고객 화면의 숫자입니다."
},
{
"kind": "statement",
"eyebrow": "반드시 나올 질문",
"title": "\"근로자 감시 아닙니까\"",
"lead": "노조가 물을 것이고, 물어야 합니다. 답은 약속이 아니라 구조여야 합니다.",
"columns": [
{
"head": "영상을 녹화하지 않습니다",
"body": "실시간으로 들여다보는 화면 자체가 제품에 없습니다. 위험 상황이 감지된 순간에만 사진 3장이 남고, 7일 뒤 자동 삭제됩니다."
},
{
"head": "누구인지 모릅니다",
"body": "이름도 사번도 얼굴 인식도 없습니다. 얼굴은 카메라 쪽에서, 전송 전에 가려집니다."
},
{
"head": "근무태도 기능이 없습니다",
"body": "감지 20종 전부가 위험 상태입니다. 자리 비움·작업 속도는 만들 수 있는 기능 자체가 없습니다."
}
],
"note": "존재하지 않는 데이터는 열람될 수 없고, 유출될 수 없고, 목적 외로 쓰일 수 없습니다. 접근 통제는 되돌릴 수 있지만 미수집은 되돌릴 수 없습니다."
},
{
"kind": "figure",
"eyebrow": "구성",
"title": "현장에 노드, 사무실에 대시보드",
"image": "06-구성도.png",
"note": "노드에서 서버로 가는 것은 스냅샷 3장과 메타데이터뿐입니다. 폐쇄망에서도 동작하며, 회선이 끊긴 동안의 이벤트는 노드에 쌓였다가 복구되면 올라갑니다."
},
{
"kind": "status",
"eyebrow": "현재 상태",
"title": "지금 어디까지 와 있습니까",
"done": {
"head": "완료 — 1.2.0 납품 버전",
"items": [
"감지 20종(추락·동시 다발 포함) · 통보 · 에스컬레이션 · 사고조사 패키지",
"자동 테스트 548건 통과 (엣지 308 · 서버 240)",
"납품 점검 43건 + 재감사 12건 전량 해소 — 판정 적합",
"폐쇄망 설치 패키지 · 역할별 사용설명서"
]
},
"pending": {
"head": "남은 것 — 실장비 현장 검증",
"items": [
"경광등 실제 점등 · 카메라 감도 현장 튜닝",
"실제 영상으로 넘어짐 판정 타이밍 확인",
"보호구 미착용 · 중장비 근접 · 화재 감지는 모델 확보가 선행되어야 합니다"
]
},
"note": "감지율 100%는 없습니다. 초기에는 오탐이 반드시 납니다. 그 사실을 숨기지 않는 것이 이 시스템을 계속 쓰게 만드는 조건입니다."
},
{
"kind": "closing",
"eyebrow": "요약",
"title": "이 시스템이 하는 일",
"lines": [
"쓰러진 자세가 <b>3초</b> 지속되면 확정하고,",
"감지한 노드가 <b>즉시</b> 경광등을 울리고,",
"<b>1분</b> 안에 담당자에게, <b>5분</b> 안에 확인되지 않으면 위로 올립니다.",
"그리고 무슨 일이 있었는지 <b>지울 수 없는 형태로</b> 남깁니다."
],
"foot": "감지 · 대응 · 증거"
}
]
}