release: 2026-04-20 (37건 커밋) #89
No reviewers
레이블
레이블 없음
마일스톤 없음
담당자 없음
참여자 2명
알림
마감일
마감일이 설정되지 않았습니다.
의존성
No dependencies set.
Reference: gc/kcg-ai-monitoring#89
불러오는 중...
Reference in New Issue
Block a user
No description provided.
Delete Branch "release/2026-04-20"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
release: 2026-04-20
develop → main (37 commits, 5 features + 2 fixes + 1 schema + 2 docs = 10 주요 변경)
주요 내용 ([2026-04-20])
추가
ai-operations:detection-models./transshipment경로 READ 전용 대시보드. 5단계 필터 파이프라인 결과 통합 조회. V033 권한./illegal-fishing경로 READ 전용 대시보드.GEAR_ILLEGAL+EEZ_INTRUSION+ZONE_DEPARTURE3 카테고리 통합. V032 권한.변경
pipeline/stage_runner.py신설, 출력 6모듈 독립 실행 +logger.exception으로 stacktrace 보존. 한 모듈 실패가 사이클 전체 abort 를 유발하지 않음. (docs/prediction-analysis.md P1 권고)수정
SystemStatusPanelnull-safe +CatalogBadgeslabel 객체 렌더링 오류 해소.gear_parent_inference의StringDataRightTruncation으로 매 사이클 실패하던 기존 버그 해소 (Phase 0-1 의 stacktrace 보존으로 발견).문서
docs/prediction-analysis.md250라인 신설 (opus 4.7 독립 리뷰).이전 기록 ([2026-04-17] 4개 날짜 넘버링 압축)
2026-04-17 당일 4번 분할 릴리즈된 항목(.2/.3/.4)을 단일 [2026-04-17] 로 압축 — GEAR_IDENTITY_COLLISION 탐지 / 디자인시스템 SSOT / i18n / iran 제거 / 백엔드 계층 분리 / RestClient bean hotfix / 절대 지침 추가.
배포 절차
/illegal-fishing//transshipment//detection-models메뉴 노출 확인릴리즈 검증
/illegal-fishing//transshipment메뉴 노출 확인포함 PR
#82, #83, #84, #85, #86, #87, #88 + 기존 develop 누적 (#73/#76/#78/#79/#80)
docs/prediction-analysis.md P1 권고 반영. 5분 사이클의 각 스테이지를 한 try/except 로 뭉친 기존 구조를 스테이지 단위로 분리해 실패 지점을 명시적으로 특정하고 부분 실패 시에도 후속 스테이지가 계속 돌아가도록 개선. - prediction/pipeline/stage_runner.py 신설 - run_stage(name, fn, *args, required=False, **kwargs) 유틸 - required=True 면 예외 re-raise (상위 사이클 try/except 가 잡도록) - required=False 면 logger.exception 으로 stacktrace 보존 + None 반환 - 지속시간 로깅 포함 - prediction/scheduler.py run_analysis_cycle() 수정 - 출력 단계 6모듈을 각각 run_stage() 로 분리: violation_classifier / event_generator / kpi_writer / stats_aggregate_hourly / stats_aggregate_daily / alert_dispatcher - upsert_results / cleanup_old 도 run_stage 로 래핑 (upsert 는 required=True) - 내부 try/except 의 logger.warning → logger.exception 으로 업그레이드 (fetch_dark_history, gear collision event promotion, group polygon, gear correlation, pair detection, chat cache) - 스테이지 실패 시 journalctl -u kcg-ai-prediction 에서 stacktrace 로 원인 바로 특정 가능 (기존은 "failed: X" 한 줄만 남아 디버깅 불가) 검증: - python3 -c "import ast; ast.parse(...)" scheduler.py / stage_runner.py 통과 - run_stage smoke test (정상/실패 흡수/required 재raise 3가지) 통과 범위 밖 (후속): - Phase 0-2 ILLEGAL_FISHING_PATTERN 전용 페이지 (다음 MR) - Phase 0-3 Transshipment 전용 페이지 (다음 MR)docs/prediction-analysis.md §7 P1 권고의 "UI 미노출 탐지" 해소 중 두 번째. prediction algorithms/transshipment.py 5단계 필터 파이프라인 결과를 전체 목록· 집계·상세 수준으로 조회하는 READ 전용 대시보드. ### 배경 기존 features/vessel/TransferDetection.tsx 는 선박 상세 수준(특정 MMSI 의 환적 이력)이고, 환적 의심 선박 전체 목록을 보려면 ChinaFishing 의 탭 중 하나를 거쳐야 했다. /api/analysis/transship 엔드포인트는 이미 존재하나 전용 페이지가 없었음. ### 변경 - frontend/src/features/detection/TransshipmentDetection.tsx 신설 (405 라인) - PageContainer + PageHeader(ArrowLeftRight) + KPI 5장 (Total / Transship tier CRITICAL/HIGH/MEDIUM / Risk CRITICAL) - DataTable 8컬럼 (analyzedAt / mmsi / pairMmsi / duration / tier / risk / zone) - features.transship_tier 읽어 Badge 로 심각도 표시 - 필터: hours(1/6/12/24/48) / riskLevel / mmsi 검색 - 상세 패널: 분석 피처 JSON 원본 + 좌표 + transship_score - 기존 analysisApi.getTransshipSuspects 재사용 — backend 변경 없음 - index.ts + componentRegistry.ts 등록 - detection.json (ko/en) transshipment.* 네임스페이스 추가 (각 44키) - common.json (ko/en) nav.transshipment 추가 - V033__menu_transshipment_detection.sql - auth_perm_tree(detection:transshipment, nav_sort=910) - ADMIN 5 ops + OPERATOR/ANALYST/FIELD/VIEWER READ ### 권한 주의 /api/analysis/transship 의 @RequirePermission 은 현재 detection:dark-vessel. 이 메뉴 READ 만으로는 API 호출 불가. 현행 운영자 역할(OPERATOR/ANALYST/FIELD) 은 dark-vessel READ 도 보유하므로 실용 동작. 향후 VesselAnalysisController.listTransshipSuspects 의 @RequirePermission 을 detection:transshipment 로 교체하는 권한 일관화는 별도 MR (후속). ### 검증 - npx tsc --noEmit 통과 - pre-commit tsc + ESLint 통과 예정 - Flyway V033 자동 적용 (백엔드 재배포 필요)### SystemStatusPanel TypeError - 증상: /monitoring 에서 Uncaught TypeError: Cannot read properties of undefined (reading 'toLocaleString') - 원인: stats 객체는 존재하나 total 필드가 undefined 인 경우 (백엔드 응답이 기대 shape 와 다를 때) 크래시 - 수정: stats?.total != null ? ... / stats.critical ?? 0 식 null-safe 전환 (total/clusterCount/gearGroups/critical/high/medium/low 전부) ### CatalogBadges 렌더링 오류 - 증상: /design-system.html 에서 (1) Each child in a list should have a unique "key" prop (2) Objects are not valid as a React child (found: object with keys {ko, en}) - 원인: PERFORMANCE_STATUS_META 의 meta 는 {intent, hex, label: {ko, en}} 형식. code 필드 없고 label 이 객체. - Object.values() + <Trk key={meta.code}> 로 undefined key 중복 - getKoLabel 이 meta.label (객체) 그대로 반환해 Badge children 에 객체 주입 다른 카탈로그는 fallback: {ko, en} 패턴이라 문제 없음 (performanceStatus 만 label 객체) - 수정: - Object.entries() 로 순회해 Record key 를 안정적 식별자로 사용 - AnyMeta.label 타입을 string | {ko,en} 확장 - getKoLabel/getEnLabel 우선순위: fallback.ko → label.ko → label(문자열) → code → key - PERFORMANCE_STATUS_META 자체는 변경 안 함 (admin 페이지들이 label.ko/label.en 직접 참조 중) ### 검증 - npx tsc --noEmit 통과 - pre-commit tsc+ESLint 통과release 2026-04-20 승인 (via /release skill, develop→main 37 커밋)