move_detect/CHANGELOG.md
유창욱 9596d1bad6 release: 1.0.0 — 첫 정식 납품 버전
0.9.0 까지가 "감지하는 시스템"이었다면 1.0.0 은 "감지에 대응하는 시스템"이다. 그 차이를
만드는 것은 e00ad69 의 통보 경로이고, 이 커밋은 그것을 실제로 납품 가능한 형태로 만든다.

VERSION 0.9.0 -> 1.0.0

릴리스 규칙 위반 3건 수정 (rules/release-versioning.md)
- 산출물 파일명에 버전·날짜가 없었다. move-detect-cafe24.zip / 2_pi_install-<arch>.tar.gz
  는 같은 날 두 번 빌드하면 구분이 안 되고, 현장이 무엇을 돌리는지 파일명으로 답할 수
  없었다. 이제 move-detect-cafe24-<VERSION>-<YYYYMMDD>.zip /
  move-detect-pi-<VERSION>-<YYYYMMDD>-<arch>-<abi>-<hailo>.tar.gz.
- 두 빌드 스크립트가 VERSION 파일이 없으면 "unknown" 으로 넘어갔다. 무버전 산출물은
  빌드머신을 떠나는 순간 커밋과 대조할 방법이 사라진다 — 이제 exit 1 로 거부한다.
- deploy/README.md 의 stale 파일명 표기 갱신.

납품 동봉물 (skill delivery-audit: "설명서 + 점검 리포트 동봉")
- CHANGELOG.md 신설. 업그레이드 절차와 알려진 제약(모델 미확보 3종)을 명시.
- 역할별 사용 설명서를 패키지에 동봉. 운영자/안전관리자/시스템관리자 3역할 14절 + FAQ 6항,
  실제 화면 캡처 8장을 base64 로 박은 단일 HTML(665KB). 폐쇄망에서 메일·USB 로 돌아다녀도
  도판이 깨지지 않아야 하므로 단일 파일이다.
  생성물은 커밋하지 않는다 — 소스(manual.json + shots/)만 두고 패키저가 매번 빌드한다.
  커밋된 사본은 화면이 바뀐 뒤에도 최신처럼 보이고, 구 UI 캡처가 남은 매뉴얼은 납품물
  자체의 결함이다.
- 감사 리포트를 '납품점검-리포트.md' 로 동봉. 무엇을 점검했고 무엇이 잔여인지 패키지가
  스스로 답하지 못하면, 인수인계 몇 달 뒤 그 답을 아는 사람이 남지 않는다.

README-UPLOAD 에 크론 안내 신설 (누락이었다)
  설치 안내서에 자동 실행 등록이 아예 없었다. 이 릴리스의 핵심인 통보가 크론 없이는 한 건도
  나가지 않는데, 운영자가 읽는 유일한 문서가 그 사실을 말하지 않았다.
  8번(알림 켜기: 크론 2개 + --dry-run 선행 + 경광등 우선) / 9번(설치 점검 /setup) 추가,
  마지막 체크리스트에 3항목 추가.

부수 수정
- 셸 스크립트에 CRLF 가 섞여 bash 가 여는 중괄호에서 죽었다(빌드 자체가 불가). LF 로 정규화.
  cafe24 스크립트에는 bash -n 가드가 이미 있어 이번에 실제로 잡았고, Pi 쪽에는 없어서
  그대로 지나갈 뻔했다 — tests/test_deploy_artifacts.py 에 CRLF·bash -n 가드 추가.

산출물
  dist/move-detect-cafe24-1.0.0-20260818.zip
  dist/move-detect-pi-1.0.0-20260818-aarch64-cp311-hailo8.tar.gz

검증: pytest 통과(skip 3 = 하드웨어·환경) · PHPUnit 224 (skip 0).
매뉴얼 실렌더 확인(목차 정합·도판 8장·콜아웃). 패키지 내부 검증: 버전 스탬프 1.0.0,
마이그레이션 8/8 동봉, config.php 는 CHANGEME 템플릿, tools/ 는 www 밖에만,
웹 루트 PHP 는 index.php/_preflight.php 뿐.
2026-08-18 14:04:28 +09:00

5.7 KiB

CHANGELOG — move-detect (작업장 안전 AI CCTV)

버전 표기는 저장소 루트 VERSION 파일이 단일 출처입니다. 납품 산출물 파일명에도 같은 버전이 들어갑니다: move-detect-cafe24-<VERSION>-<YYYYMMDD>.zip / move-detect-pi-<VERSION>-<YYYYMMDD>-<arch>.tar.gz


1.0.0 — 2026-08-18 · 첫 정식 납품 버전

0.9.0 까지가 "감지하는 시스템"이었다면, 1.0.0 은 "감지에 대응하는 시스템" 입니다. 그 차이를 만드는 것이 아래 첫 항목입니다.

추가 — 통보 (이 버전의 이유)

이전까지 감지는 브라우저 탭이 열려 있고 사람이 보고 있어야만 전달됐습니다. 새벽 3시에 넘어진 작업자는 DB 에 행 하나를 남기고 아침을 맞았습니다.

  • 현장 경광등·부저 (엣지 GPIO). 서버도 인터넷도 거치지 않고 감지한 노드가 직접 울립니다. 정전·회선 장애로 업링크가 끊긴 순간은 오히려 위험이 높아지는 때이므로, 어떤 현장이든 이것부터 설정합니다.
  • 메일 · 웹훅 채널과 1분 주기 디스패처. 알림에는 현장 이미지를 싣지 않고 링크만 보냅니다 (스냅샷은 개인정보이고, 메일링 리스트로 나가는 순간 인증 프록시의 통제를 벗어납니다).
  • 미확인 경보 에스컬레이션. 위급/높음이 정해진 시간 동안 확인되지 않으면 그 사실 자체가 사건이 되어 상위 담당자에게 통보됩니다. "아무도 보지 않았다"가 처음으로 기록에 남습니다.

추가 — 조용한 실패 드러내기

  • 카메라 화각 변경 · 가림 · 조도 저하 감지. 위험구역 판정은 카메라가 어제와 같은 곳을 본다는 전제 위에 서 있는데, 청소하다 삼각대를 스치면 제한구역이 엉뚱한 바닥을 가리키면서 시스템은 계속 초록불이었습니다.
  • 저장 공간 부족 경고. 디스크가 차면 이미지 저장만 조용히 실패하고 화면은 멀쩡해 보입니다.
  • 설정 지연 표시가 실제로 동작하게 됐습니다. 지표는 있었지만 그것을 켜는 사건이 없었습니다.

추가 — 관리 화면 (그전에는 DB 직접 수정이 유일한 방법)

  • 감지 임계값 편집 (허용 범위·단위·설명을 화면이 강제)
  • 통보 경로 설정
  • 정비 중 알람 억제 — 사유 필수, 최대 8시간, 자동 만료. 감지와 기록은 그대로 계속되고 통보만 보류되며, 보류했다는 사실도 기록에 남습니다.
  • 위험성평가 연계 · 교대 인수인계 · 설비 성능 추이 · 설치 점검(/setup)

추가 — 증거와 규정

  • 감사로그 위·변조 탐지 (해시체인). 수정·삭제·우회삽입이 전부 드러납니다.
  • 사고조사 패키지 1클릭 — 전후 타임라인, 통보 이력, 위험요인, 조치 이력, 서명란. 인쇄해서 그대로 제출할 수 있습니다.
  • 현장별 현황 (본사 계정)

변경 — 화면 (UI/UX 점검 21건)

  • 감지 스트림이 다시 시간순이 됐습니다. 확인 여부가 순서를 바꾸던 탓에 사고 재구성이 불가능했고, 확인하면 그 행이 사라지며 아래가 밀려 올라와 다른 이벤트를 잘못 확인할 수 있었습니다. 확인은 이제 제자리에서 처리됩니다.
  • 이벤트 상세에서 바로 확인/오탐 판정 · 구역 설정에 카메라 선택기 · 날짜로 조회 · 경보음 음소거(새 위급 오면 자동 해제) · 일괄 확인(위급 제외) · 키보드 조작
  • 표본이 부족한 수치는 비율 대신 원시 숫자만 보여줍니다. 6건→8건을 "▲33% 악화"로 칠하면 안전회의에서 반박당하고, 그 순간 그 화면 전체가 신뢰를 잃습니다.

도구 (move_detect_app/tools/, 웹에서 접근 불가)

도구 용도
dispatch_alerts.php 알림 발송 (크론 1분) · --dry-run 지원
maintain.php 보존기간 정리 (크론 일 1회)
backup.php DB 덤프 + 사진 아카이브 + 복구 안내
verify_audit_chain.php 감사로그 무결성 검증
seed_demo.php 시연·시험용 데모 데이터 (운영 DB 실행 금지)

업그레이드 (0.9.x → 1.0.0)

migrations/2026-08-09-safety-platform.sql 을 적용합니다. 파일 안의 9번 블록은 DB 종류에 따라 문법이 다릅니다 — MySQL 8.0.16+ / MariaDB / 제약 없음 세 경우의 안내가 파일에 적혀 있으니 SELECT VERSION(); 으로 확인 후 맞는 것을 실행하세요.

적용 후 config.php 에 public_base_url, timezone, escalate_after_seconds 를 추가하고 (템플릿 참조), 자동실행(크론) 2개를 등록해야 알림이 동작합니다 — README-UPLOAD.md 8번.

알려진 제약

  • 보호구 미착용 · 중장비 근접 · 화재 감지: 감지기 배선과 이벤트 계약은 준비되어 있으나 추론 모델이 확보되지 않아 기본 비활성입니다. 라이선스 조건을 만족하는 가중치와 Hailo 컴파일이 선행되어야 합니다. 켜져 있지 않다는 사실을 화면에서도 숨기지 않습니다.
  • 실장비 검증 잔여 항목은 docs/delivery-audit.md 의 "OFF-HW 잔여" 절을 참조하세요.

0.9.0 — 2026-08-08

납품 감사(43건) 대응. CSP nonce 도입, 보안 헤더 PHP 이관, /logout CSRF, 계정 잠금 응답에서 사용자명 열거 제거. 엣지 큐 flush 상한, 타이머 env 전수 검증, 프레임 스킵 시 미블러 얼굴 유출 차단, systemd 워치독. PDO 통합 테스트 복구, 라우트 테이블 대조, 산출물↔소스 패리티 검사, CI 신설. 납품물에 version/git_commit/built_at 스탬프.