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
203 lines
No EOL
9.7 KiB
JSON
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": "감지 · 대응 · 증거"
|
|
}
|
|
]
|
|
} |