kcg-ai-monitoring/docs/RELEASE-NOTES.md

39 KiB

Release Notes

이 문서는 Keep a Changelog 형식을 따릅니다.

[Unreleased]

문서

  • 2026-04-20 릴리즈 후속 정적 문서 최신화architecture.md 27→29 보호 경로 + 신규 라우트 2개, sfr-traceability.md V030→V034 · 51→56 테이블 · stage_runner · Phase 0-2/0-3 페이지 반영, sfr-user-guide.md 에 "불법 조업 이벤트" + "환적 의심 탐지" 사용자 가이드 섹션 신설, system-flow-guide.md V030~V034 매니페스트 미반영 경고 확장, prediction-analysis.md P1 권고 4건 중 3건 완료() 표시

[2026-04-20]

추가

  • Detection Model Registry DB 스키마 (V034, Phase 1-1) — prediction 17 탐지 알고리즘을 "명시적 모델 단위" 로 분리하고 프론트엔드에서 파라미터·버전·가중치를 관리할 수 있는 기반 인프라. 테이블 4종(detection_models 카탈로그 / detection_model_dependencies DAG / detection_model_versions 파라미터 스냅샷·라이프사이클·role / detection_model_run_outputs 월별 파티션) + 뷰 1개(v_detection_model_comparison PRIMARY×SHADOW JOIN). 한 모델을 서로 다른 파라미터로 동시 실행(PRIMARY 1 + SHADOW/CHALLENGER N) 지원, ACTIVE×PRIMARY 는 UNIQUE partial index 로 1건 보호. 권한 트리 ai-operations:detection-models(nav_sort=250) + ADMIN 5 ops / OPERATOR READ+UPDATE / ANALYST·VIEWER READ. (후속: Phase 1-2 Model Registry + DAG Executor, Phase 2 PoC 5 모델 마이그레이션)
  • 환적 의심 전용 탐지 페이지 신설 (Phase 0-3)/transshipment 경로에 READ 전용 대시보드 추가. prediction algorithms/transshipment.py 의 5단계 필터 파이프라인 결과(is_transship_suspect=true)를 전체 목록·집계·상세 수준으로 조회. KPI 5장(Total + Transship tier CRITICAL/HIGH/MEDIUM + 종합 위험 CRITICAL) + DataTable 8컬럼 + 필터(hours/level/mmsi) + features JSON 상세. 기존 /api/analysis/transship + getTransshipSuspects 재사용해 backend 변경 없음. V033 마이그레이션으로 detection:transshipment 권한 트리 + 전 역할 READ 부여. (docs/prediction-analysis.md P1 UI 미노출 탐지 해소 — 2/2)
  • 불법 조업 이벤트 전용 페이지 신설 (Phase 0-2)/illegal-fishing 경로에 READ 전용 대시보드 추가. event_generator 가 생산하는 GEAR_ILLEGAL(G-01/G-05/G-06) + EEZ_INTRUSION(영해·접속수역) + ZONE_DEPARTURE(특정수역 진입) 3 카테고리를 한 화면에서 통합 조회. 심각도 KPI 5장 + 카테고리별 3장 + DataTable(7컬럼) + 필터(category/level/mmsi) + JSON features 상세 패널 + EventList 네비게이션. 기존 /api/events 를 category 다중 병렬 조회로 래핑하여 backend 변경 없이 구현. V032 마이그레이션으로 detection:illegal-fishing 권한 트리 + 전 역할 READ 부여 (운영자 처리 액션은 EventList 경유)

변경

  • Prediction 5분 사이클 스테이지 에러 경계 도입 (Phase 0-1)prediction/pipeline/stage_runner.py 신설해 run_stage(name, fn, required=False) 유틸 제공. scheduler.py run_analysis_cycle() 의 출력 6모듈(violation_classifier / event_generator / kpi_writer / stats_aggregate_hourly / stats_aggregate_daily / alert_dispatcher)을 한 try/except 로 묶던 구조를 스테이지별 독립 실행으로 분리, 한 모듈이 깨져도 다른 모듈이 계속 돌아가도록 개선. upsert_results 는 required=True 로 실패 시 사이클 abort. 내부 try/except 의 logger.warninglogger.exception 으로 업그레이드(fetch_dark_history / gear collision event promotion / group polygon / gear correlation / pair detection / chat cache)하여 journalctl -u kcg-ai-prediction 에서 stacktrace 로 실패 지점 즉시 특정 가능. (docs/prediction-analysis.md P1 권고)

수정

  • 모니터링/디자인시스템 런타임 에러 해소/monitoringSystemStatusPanel 에서 stats.total.toLocaleString() 호출이 백엔드 응답 shape 이슈로 stats.total 이 undefined 일 때 Uncaught TypeError 로 크래시하던 문제 null-safe 로 해소(stats?.total != null). /design-system.htmlCatalogBadgesPERFORMANCE_STATUS_METAlabel: {ko, en} 객체를 그대로 Badge children 으로 주입해 "Objects are not valid as a React child" 를 던지고 code 필드 부재로 key 중복 경고가 함께 뜨던 문제 해소 — Object.entries 순회 + AnyMeta.labelstring | {ko,en} 로 확장 + getKoLabel/getEnLabel 에 label 객체 케이스 추가
  • gear_group_parent_candidate_snapshots.candidate_source VARCHAR(30)→(100) 확장 (V031) — prediction gear_parent_inference 가 여러 source 라벨을 쉼표로 join 한 값(최대 ~39자)이 VARCHAR(30) 제약을 넘어 매 사이클 StringDataRightTruncation 으로 gear correlation 스테이지 전체가 실패하던 기존 버그. Phase 0-1 (PR #83) 의 logger.exception 전환으로 풀 stacktrace 가 journal 에 찍히면서 원인 특정. backend JPA 엔티티 미참조로 재빌드 불필요, Flyway 자동 적용, prediction 재기동만으로 해소

문서

  • Prediction 모듈 심층 분석 리포트 신설docs/prediction-analysis.md (9개 섹션, 250 라인). opus 4.7 독립 리뷰 관점에서 현재 17 알고리즘의 레이어 분리·5분 사이클 시퀀스·4대 도메인 커버리지를 평가하고, 6축(관심사 분리/재사용성/테스트 가능성/에러 격리/동시성/설정 가능성)으로 구조 채점 + P1~P4 개선 제안·임계값 전수표 제공
  • 루트·SFR 문서 drift 해소 — V001~V016 → V030 + 51 테이블, Python 3.9 → 3.11+, 14 → 17 알고리즘 모듈 실측 반영. SFR-10 에 GEAR_IDENTITY_COLLISION 패턴 + GearCollisionDetection 페이지 섹션 추가 (sfr-traceability/sfr-user-guide), /gear-collision 라우트 architecture.md 포함, system-flow-guide 노드 수 102→115 + V030 manifest 미반영 경고, backend/README "Phase 2 예정" 상태 → 실제 운영 구성 전면 재작성 (PR #79 hotfix 요구사항 명시)

[2026-04-17]

추가

  • 어구 정체성 충돌(GEAR_IDENTITY_COLLISION) 탐지 패턴 — 동일 어구 이름이 서로 다른 MMSI 로 같은 5분 사이클에 동시 AIS 송출되는 스푸핑/복제 의심 패턴을 신규 탐지. prediction fleet_tracker.track_gear_identity() 가 공존(simultaneous) / 교체(sequential) 경로를 분리해 공존 쌍은 gear_identity_collisions 에 UPSERT (누적 공존 횟수, 최대 거리, 양측 좌표, evidence JSONB append). 심각도는 거리/누적/스왑 기반으로 CRITICAL/HIGH/MEDIUM/LOW 자동 재계산, 운영자 확정 상태(CONFIRMED_ILLEGAL/FALSE_POSITIVE)는 보존. CRITICAL/HIGH 승격 시 prediction_events 허브에 GEAR_IDENTITY_COLLISION 카테고리 등록(dedup 367분). /api/analysis/gear-collisions READ + resolve 액션(REVIEWED/CONFIRMED_ILLEGAL/FALSE_POSITIVE/REOPEN, @Auditable GEAR_COLLISION_RESOLVE). 좌측 메뉴 "어구 정체성 충돌" 자동 노출(nav_sort=950, detection:gear-collision)
  • gearCollisionStatuses 카탈로그shared/constants/gearCollisionStatuses.ts + catalogRegistry 등록으로 design-system 쇼케이스 자동 노출. OPEN/REVIEWED/CONFIRMED_ILLEGAL/FALSE_POSITIVE 4단계 Badge intent 매핑
  • performanceStatus 카탈로그 등록 — 이미 존재하던 shared/constants/performanceStatus.ts (good/normal/warning/critical/running/passed/failed/active/scheduled/archived 10종) 를 catalogRegistry 에 등록. design-system 쇼케이스 자동 노출 + admin 성능/보관/검증 페이지 SSOT 일원화

변경

  • 디자인 시스템 SSOT 일괄 준수 (30파일)frontend/design-system.html 쇼케이스의 공통 컴포넌트와 shared/constants/ 카탈로그를 우회하던 하드코딩 UI 를 전영역 치환. raw <button><Button variant> / raw <input><Input> / raw <select><Select> / 커스텀 탭 → <TabBar> + <TabButton> / raw checkbox → <Checkbox>. text-red-400 같은 다크 전용 색상을 text-red-600 dark:text-red-400 쌍으로 라이트 모드 대응. StatBox color: string prop 을 intent: BadgeIntent + INTENT_TEXT_CLASS 매핑으로 재설계. 에러 메시지도 t('error.errorPrefix', { msg }) 로 통일. 영역: detection(6) / detection/components(4) / enforcement / surveillance(2) / admin(7) / parent-inference(3) / statistics / ai-operations(3) / dashboard / field-ops(2) / auth
  • i18n 하드코딩 한글 제거 (alert/confirm/aria-label 우선순위)common.jsonaria / error / dialog / success / message 네임스페이스 추가 (ko/en 대칭, 52개 키). 운영자 노출 alert('실패: ' + msg) 11건과 접근성 위반 aria-label="역할 코드" 등 40+건을 t('aria.*') / t('error.*') / t('dialog.*') 로 일괄 치환
  • iran 백엔드 프록시 잔재 제거IranBackendClient dead class 삭제, application.ymliran-backend: 블록 + AppProperties.IranBackend inner class 정리. prediction 이 kcgaidb 에 직접 write 하는 현 아키텍처에 맞춰 CLAUDE.md 시스템 구성 다이어그램 최신화. Frontend UI 라벨 iran 백엔드 (분석)AI 분석 엔진 로 교체, system-flow manifest external.iran_backend 노드는 status: deprecated 마킹
  • 백엔드 계층 분리 — AlertController/MasterDataController/AdminStatsController 에서 repository·JdbcTemplate 직접 주입 패턴 제거. AlertService · MasterDataService · AdminStatsService 신규 계층 도입 + @Transactional(readOnly=true) 적용. 공통 RestClientConfig @Configuration 으로 predictionRestClient / signalBatchRestClient Bean 통합 → Proxy controller 들의 @PostConstruct ad-hoc 생성 제거
  • 감사 로그 보강EnforcementService 의 createRecord / updateRecord / createPlan 에 @Auditable 추가 (ENFORCEMENT_CREATE/UPDATE/PLAN_CREATE). VesselAnalysisGroupService.resolveParentPARENT_RESOLVE 액션 기록. 모든 쓰기 액션이 auth_audit_log 에 자동 수집
  • alertLevels 카탈로그 확장 — 8개 화면의 level === 'CRITICAL' ? ... : 'HIGH' ? ... 식 직접 분기를 제거하기 위해 isValidAlertLevel (타입 가드) / isHighSeverity / getAlertLevelOrder / ALERT_LEVEL_MARKER_OPACITY / ALERT_LEVEL_MARKER_RADIUS / ALERT_LEVEL_TIER_SCORE 헬퍼·상수 신설. LiveMapView 마커 시각 매핑, DarkVesselDetection tier→점수, GearIdentification 타입 가드, vesselAnomaly 패널 severity 할당 헬퍼로 치환
  • prediction 5분 사이클 안정화gear_correlation_scores_pkey 충돌이 매 사이클 InFailedSqlTransaction 을 유발해 이벤트 생성·분석 결과 upsert 가 전부 스킵되던 문제 해소. gear_correlation_scorestarget_mmsi 이전 쿼리를 SAVEPOINT 로 격리해 PK 충돌 시 트랜잭션 유지. 공존 경로는 이전 시도 자체를 하지 않아 재발 방지

수정

  • 백엔드 RestClient bean 모호성으로 기동 실패 해소 — rocky-211 kcg-ai-backend 가 restart 시 No qualifying bean of type RestClient, but 2 were found: predictionRestClient, signalBatchRestClient 로 크래시 루프 진입하던 문제. PR #A(2026-04-17) 의 RestClientConfig 도입 이후 잠복해 있던 버그로, @RequiredArgsConstructor 가 생성한 constructor parameter 에 필드의 @Qualifier 가 복사되지 않아 Spring 6.1 의 parameter-level annotation 기반 주입이 실패한 것. 수정: backend/pom.xmlmaven-compiler-plugin 실행 설정에 <parameters>true</parameters> 명시 + backend/src/main/java/lombok.config 신설해 lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier 등록

문서

  • 절대 지침 섹션 추가 — CLAUDE.md 최상단에 "절대 지침(Absolute Rules)" 섹션 신설. (1) 신규 브랜치 생성 전 git fetchorigin/develop 대비 뒤처지면 사용자 확인 → git pull --ff-only → 분기하는 동기화 절차 명시, (2) frontend/ 작업 시 design-system.html 쇼케이스 규칙 전면 준수(공통 컴포넌트 우선 사용, 인라인/하드코딩 Tailwind 색상·!important 금지, 접근성 필수 체크리스트) 요약. 하단 기존 "디자인 시스템 (필수 준수)" 상세 섹션과 연결
  • 프로젝트 산출문서 2026-04-17 기준 정비architecture.md shared/components/ui 9개·i18n 네임스페이스 갱신, sfr-traceability.md v3.0 전면 재작성(운영 상태 기반 531라인), sfr-user-guide.md 헤더 + SFR-01/02/09/10/11/12/13/17 구현 현황 갱신, stale 3건 제거

[2026-04-16.7]

변경

  • 경량 분석 riskScore 해상도 개선compute_lightweight_risk_scoredark_suspicion_score(0~100 패턴 기반 의심도) / dist_from_baseline_nm(EEZ 외 기선 근접도 12·24NM 차등) / dark_history_24h(반복 이력) 반영. 허가·반복 이중계산 방지 축소 로직. 배포 후 실측: 45점 60.8% 고정 수렴 → 0% (11~40 구간 고르게 분산)
  • vessel_type 매핑 — fleet_vessels 등록선 fishery_code (PT/PT-S/OT/GN/PS/FC) 를 TRAWL/GILLNET/PURSE/CARGO 로 매핑하는 vessel_type_mapping.py 신설. 경량 경로의 vessel_type='UNKNOWN' 하드코딩 제거. 실측: UNKNOWN 98.6% → 89.1% (886척이 구체 유형으로 전환)
  • VesselType 값 확장 — 기존 TRAWL/PURSE/LONGLINE/TRAP/UNKNOWN 에 GILLNET(유자망) / CARGO(운반선) 2종 추가
  • 중국 선박 분석 그리드 정합성 — Tab 1 상단 RealAllVessels 편의 export 를 mmsiPrefix='412' 로 고정 + 제목 "중국 선박 전체 분석 결과 (실시간)" 로 변경. 상단/하단 모두 중국 선박 기준으로 일관 표시

추가

  • 선박 유형 한글 카탈로그shared/constants/vesselTypes.ts 신설. 저인망/선망/유자망/연승/통발/운반선/미분류 한글 라벨 + Badge intent. 기존 alertLevels 패턴 답습, catalogRegistry 등록으로 design-system 쇼케이스 자동 노출

[2026-04-16.6]

추가

  • 중국어선 감시 화면 실데이터 연동 (3개 탭) — deprecated iran proxy /api/vessel-analysis → 자체 백엔드 /api/analysis/* 전환. AI 감시 대시보드·환적접촉탐지·어구/어망 판별 모두 prediction 5분 사이클 결과 실시간 반영. 관심영역/VIIRS/기상/VTS 카드는 "데모 데이터" 뱃지, 비허가/제재/관심 선박 탭은 "준비중" 뱃지로 데이터 소스 미연동 항목 명시
  • 특이운항 미니맵 + 판별 구간 패널 — AI 감시 대시보드 선박 리스트 클릭 → 24h AIS 항적(MapLibre + deck.gl) + Dark/Spoofing/환적/어구위반/고위험 신호를 시간순 segment 로 병합해 지도 하이라이트(CRITICAL/WARNING/INFO 3단계). 판별 패널에 시작~종료·지속·N회 연속 감지·카테고리·설명 표시. 어구/어망 판별 탭 최하단 자동탐지 결과 row 클릭 시 상단 입력 폼 프리필
  • /api/analysis/stats — MMSI별 최신 row 기준 단일 쿼리 COUNT FILTER 집계(total/dark/spoofing/transship/risk 분포/zone 분포/fishing/avgRiskScore + windowStart/End). 선택적 mmsiPrefix 필터(중국 선박 '412' 등)
  • /api/analysis/gear-detections — gear_code/judgment NOT NULL row MMSI 중복 제거 목록. 자동 탐지 결과 섹션 연동용
  • /api/analysis/vessels 필터 확장mmsiPrefix / minRiskScore / minFishingPct 쿼리 파라미터 추가
  • VesselAnalysisResponse 필드 확장violationCategories / bd09OffsetM / ucafScore / ucftScore / clusterId 5개 필드 노출
  • prediction 분석 시점 좌표 저장AnalysisResult + to_db_tuple + upsert_results SQL 에 lat/lon 추가. 분류 파이프라인(last_row) / 경량 분석(all_positions) 두 경로 주입. 기존 vessel_analysis_results.lat/lon 컬럼이 항상 NULL 이던 구조적 누락 해결 (첫 사이클 8173/8173 non-null 확인)

[2026-04-16.5]

변경

  • Admin 11개 페이지 디자인 시스템 하드코딩 색상 제거 (Phase 1-B) — 129건 Tailwind 색상 → 시맨틱 토큰(text-label/text-heading/text-hint) + Badge intent 치환. raw <button><Button> 컴포넌트 교체. 미사용 import 정리

[2026-04-16.4]

추가

  • G-02 금어기 조업 탐지fishery_permit_cn.fishing_period_1/2 파싱(YYYY/MM/DD 범위) + classify_gear_violations() 에 permit_periods/observation_ts 인자 추가. 허가기간 밖 조업 시 CLOSED_SEASON_FISHING judgment
  • G-03 미등록/허가외 어구 탐지 — 감지 어구와 fishery_code 허용 목록 대조(PT→trawl, GN→gillnet, FC→금지 등). 불일치 시 UNREGISTERED_GEAR judgment
  • NAME_FUZZY 매칭 — 선박명 정규화(공백/대소문자/'NO.' 마커 통일, 선박번호 유지) + name_en 기반 fuzzy lookup. 동명이 중복 방지. 매칭률 9.1% → 53.1%
  • 서버 스크립트 tier/G-02/G-03/match_method 추적 — diagnostic(5분) + hourly(1시간) 에 pair_tier 분포, reject 사유 카운터, fishery_code×match_method 교차, G-02/G-03 상세 섹션

변경

  • pair_trawl tier 분류 — AND 게이트(스펙 100% 2시간) 대신 STRONG/PROBABLE/SUSPECT 3단계. 완화 임계(800m/SOG 1.5-5/sog_delta 1.0/cog 20°)로 실제 공조 신호 포착. G-06 판정은 STRONG/PROBABLE 만
  • pair_trawl join key — raw AIS timestamp → time_bucket(5분 리샘플). sog/cog on-demand 계산(_ensure_sog_cog)으로 vessel_store._tracks 직접 사용
  • pair base 확장 — classification 500척 → 전체 중국 MID(412/413/414) 조업 속력대 선박. candidates 61→1,668, detected 0→57
  • match_ais_to_registry 대상 확장 — vessel_dfs(500척) → vessel_store._tracks 전체 중국 선박(8k+)

수정

  • violation_classifierCLOSED_SEASON_FISHING, UNREGISTERED_GEAR judgment → ILLEGAL_GEAR 카테고리 매핑 추가

[2026-04-16.3]

변경

  • Admin 3개 페이지 디자인 시스템 준수 리팩토링 (Phase 1-A) — PerformanceMonitoring/DataRetentionPolicy/DataModelVerification 자체 탭 네비 → TabBar/TabButton 공통 컴포넌트, 원시 <button>TabButton, PerformanceMonitoring 정적 hex 9건 → performanceStatus 카탈로그 경유
  • 신규 카탈로그 shared/constants/performanceStatus.ts — PerformanceStatus(good/warning/critical/running/passed/failed/active/scheduled/archived) → {intent, hex, label} + utilizationStatus(ratio) 헬퍼
  • RBAC skeleton — 3개 페이지 최상단 useAuth().hasPermission('admin:{resource}', 'OP') 호출 배치 (Phase 3 액션 버튼 추가 시 가드로 연결)

[2026-04-16.2]

추가

  • 성능 모니터링(PER-01~06) 메뉴 — 시스템관리 > 감사·보안에 성능 모니터링 페이지 추가 (PerformanceMonitoring 컴포넌트 + V028 메뉴 마이그레이션)
  • 데이터 모델 검증(DAR-11) 메뉴 — DataModelVerification 페이지 + V027 메뉴
  • 데이터 보관·파기 정책(DAR-10) 메뉴 — DataRetentionPolicy 페이지 + V026 메뉴
  • DAR-03 5종 어구 구조 비교 — AI 모델관리 어구 탐지 탭에 저층 트롤 / 스토우넷 / 자망 / 통발 / 쌍끌이 이미지 및 설명 추가
  • 단속 계획 탭 확장 — 단일 함정 순찰 작전 / 다함정 순찰 작전 탭 추가 (EnforcementPlan)

[2026-04-16]

추가

  • 한중어업협정 중국어선 허가현황 레지스트리kcg.fishery_permit_cn 신규 테이블(29컬럼, 연단위 스냅샷). V029 마이그레이션 + fleet_vessels.permit_year/fishery_code 컬럼 추가. load_fishery_permit_cn.py로 연도별 XLS → DB 적재(906척/497 신청인사)
  • 페어 탐색 재설계find_pair_candidates() bbox 1차(인접 9 cell) + 궤적 유사도 2차(location/sog_corr/cog_alignment). 동종 어선 페어도 허용, role 가점(PT_REGISTERED/COOP_FISHING/TRANSSHIP_LIKE)
  • fleet_tracker API 3개get_pt_registered_mmsis / get_gear_episodes / get_gear_positions

수정

  • DAR-03 G-04/G-05/G-06 Dead code 해결classify_gear_violations() scheduler 호출 연결. if 'pair_results' in dir() 버그 제거. 사이클당 G-05 303건 / G-04 1건 탐지 시작
  • spoofing 산식 — 24h 희석 버그 → 최근 1h 윈도우 + teleport 절대 가점(건당 0.20) + extreme(>50kn) 단독 발견 시 score=max(0.6) 확정
  • gear_code DB write 경로AnalysisResult.gear_code 필드 + kcgdb.upsert_results() INSERT/UPDATE + scheduler 두 경로에서 fleet_tracker.get_vessel_gear_code() 호출

변경

  • transshipment 선종 완화_CARRIER_HINTS(cargo/tanker/supply/carrier/reefer) 부분일치 + 412* 중국어선 FISHING 간주
  • gear drift 임계 — 750m → 500m (DAR-03 스펙 정합)
  • fleet_tracker 현재 연도 필터WHERE permit_year = EXTRACT(YEAR FROM now())::int OR permit_year IS NULL

기타

  • cron 스크립트 신규 섹션: hourly P1~P5(허가/매칭/gear_code/fleet_role) + D3.5(pair_type) / diagnostic PART 7.5 + 4-5.5

[2026-04-15]

추가

  • DAR-03 G-code 위반 분류 — prediction에 G-01(수역×어구 위반)/G-04(MMSI 사이클링)/G-05(고정어구 표류)/G-06(쌍끌이 공조) 4개 위반 유형 자동 분류 + 점수 합산
  • 쌍끌이 공조 탐지 알고리즘 — pair_trawl.py 신규 (cell-key 파티션 O(n) 스캔, 500m 근접·0.5kn 속도차·10° COG 일치·2h 지속 임계값)
  • 모선 검토 워크플로우 — 어구 판정 상세 패널에 후보 검토 UI 추가 (관측 지표 7종 평균 + 보정 지표 + 모선 확정/제외 버튼). 별도 화면 진입 없이 어구 탐지 페이지 내에서 의사결정
  • 24시간 궤적 리플레이 — TripsLayer fade trail 애니메이션, 멤버별 개별 타임라인 보간(빈 구간 자연 연속), convex hull 폴리곤 실시간 생성, 후보 선박 항적 동시 재생 (signal-batch /api/v2/tracks/vessels 프록시 연동)
  • 어구 탐지 그리드 UX — 다중 선택 필터 패널(설치 해역/판정/위험도/모선 상태/허가/멤버 수 슬라이더, localStorage 영속화), 행 클릭 시 지도 flyTo, 후보 일치율 칼럼 + 정렬

변경

  • 그리드 후보 일치율 정확도 — resolution.top_score(평가 시점 고정) 대신 correlation_scores.current_score(실시간 갱신)의 최댓값 사용 → 최신 점수 반영
  • 어구 그룹 칼럼 표시 — 모선 후보 MMSI가 그룹명 자리에 표시되던 버그 수정 (groupLabel/groupKey 우선 표시)
  • ParentResolution Entity 확장 — top_score/confidence/score_margin/decision_source/stable_cycles 등 점수 근거 7개 필드 추가
  • 백엔드 correlation API 응답 정규화 — snake_case 컬럼을 camelCase로 명시 매핑 (프론트 매핑 누락 방지)

수정

  • 궤적 리플레이 깜박임 — useMapLayers와 useGearReplayLayers가 동시에 overlay.setProps()를 호출하던 경쟁 조건 제거. 리플레이 활성 시 useMapLayers 비활성화 (단일 렌더링 경로)
  • 멤버-중심 연결선 제거 — 어구 그룹 선택 모드에서 불필요하게 그려지던 dashed 연결선 코드 삭제

기타

  • 루트 .venv/ gitignore 추가

[2026-04-14]

추가

  • DarkVesselDetection 판정 상세 패널 — 테이블 행 클릭 시 점수 산출 내역(P1~P11), GAP 상세, 7일 이력 차트 사이드 패널 표시
  • ScoreBreakdown 공통 컴포넌트 — 가점/감점 분리 점수 내역 시각화
  • darkVesselPatterns 카탈로그 확장 — prediction 실제 판정 패턴 18종 한국어 라벨+점수+설명 + buildScoreBreakdown() 유틸
  • TransferDetection 환적 운영 화면 — 5단계 파이프라인 기반 재구성 (KPI, 쌍 목록, 쌍 상세, 감시영역 지도, 탐지 조건 시각화)
  • GearDetection 모선 추론 연동 — 모선 상태(DIRECT_MATCH/AUTO_PROMOTED/REVIEW_REQUIRED), 추정 모선 MMSI, 후보 수 컬럼

변경

  • DarkVesselDetection 위치 표시 수정 — lat/lon null 시 features.gap_start_lat/lon fallback, 클릭 시 지도 하이라이트
  • EnforcementPlan 탐지 기반 단속 대상 — CRITICAL 이벤트를 카테고리별(다크베셀/환적/EEZ침범/고위험) 아이콘+라벨로 통합 표시
  • LGCNS 3개 페이지 디자인 시스템 전환 — LGCNSMLOps/AISecurityPage/AIAgentSecurityPage 공통 구조 적용

[2026-04-13]

추가

  • LGCNS MLOps 메뉴 — 시스템관리 > AI 플랫폼 하위, 모델 레지스트리/학습 파이프라인/서빙 현황/모델 모니터링 탭 구성
  • AI 보안(SER-10) 메뉴 — 시스템관리 > 감사·보안 하위, AI 모델 보안 감사/Adversarial 공격 탐지/데이터 무결성 검증/보안 이벤트 타임라인
  • AI Agent 보안(SER-11) 메뉴 — 시스템관리 > 감사·보안 하위, 에이전트 실행 로그/정책 위반 탐지/자원 사용 모니터링/신뢰도 대시보드
  • V025 마이그레이션 — auth_perm_tree에 admin:lgcns-mlops, admin:ai-security, admin:ai-agent-security 노드 + ADMIN 역할 CRUD 권한 시드
  • prediction 알고리즘 재설계 — dark_vessel 의심 점수화(8패턴 0~100), transshipment 베테랑 재설계, vessel_store/scheduler 개선
  • 프론트엔드 지도 레이어 구조 정리 — BaseMap, useMapLayers, static layers 리팩토링

변경

  • NoticeManagement CRUD 권한 가드 — admin:notices CREATE/UPDATE/DELETE 체크 추가 (disabled + 툴팁)
  • EventList CRUD 권한 가드 — enforcement:event-list UPDATE + enforcement:enforcement-history CREATE 체크 추가 (disabled + 툴팁)

[2026-04-09]

추가

  • 워크플로우 연결 5단계 — 탐지→단속 관통 워크플로우 구현
    • VesselAnalysis 직접 조회 API 5개 (/api/analysis/*) — iran proxy 없이 prediction DB 직접 조회
      • vessels 목록 (필터: mmsi, zone, riskLevel, isDark)
      • vessels/{mmsi} 최신 분석 (features JSONB 포함)
      • vessels/{mmsi}/history 분석 이력 (24h)
      • dark 베셀 목록 (MMSI 중복 제거)
      • transship 의심 목록
    • EventList 인라인 액션 4종 — 확인(ACK)/선박상세/단속등록/오탐 처리
    • MMSI → VesselDetail 링크 — EventList, DarkVessel, EnforcementHistory 3개 화면
    • VesselDetail 전면 개편 — prediction 직접 API 전환, dark 패턴 시각화(tier/score/patterns), 환적 분석, 24h AIS 수신 타임라인, 단속 이력 탭
    • DarkVesselDetection prediction 전환 — iran proxy 제거, tier 기반 KPI/필터/정렬
    • EnforcementHistory eventId 역추적 — 단속→이벤트 역링크
    • EnforcementPlan 미배정 CRITICAL 이벤트 패널 — NEW 상태 CRITICAL 이벤트 표시
    • 모선추론 자동 연결 — CONFIRM→LabelSession, REJECT→Exclusion 자동 호출
    • 30초 자동 갱신 — EventList, DarkVessel (silentRefresh 패턴, 깜박임 없음)
  • admin 메뉴 4개 서브그룹 — AI 플랫폼/시스템 운영/사용자 관리/감사·보안
  • V018 마이그레이션 — prediction_events.features JSONB 컬럼
  • V019 마이그레이션 — ai-operations:llm-ops 권한 트리 항목
  • analysisApi.ts 프론트 서비스 (직접 조회 API 5개 연동)
  • PredictionEvent.features 타입 확장 (dark_tier, transship_score 등)
  • 메뉴 DB SSOT 구조화 — auth_perm_tree 기반 메뉴·권한·i18n 통합
    • auth_perm_tree에 메뉴 컬럼 추가 (url_path, label_key, component_key, nav_group, nav_sort)
    • labels JSONB 다국어 지원 ({"ko":"종합 상황판", "en":"Dashboard"}) — DB가 i18n SSOT
    • 보이지 않는 도메인 그룹 8개 삭제 (surveillance, detection 등) → 권한 트리 = 메뉴 트리 완전 동기화
    • 패널 노드 parent_cd 실제 소속 페이지로 수정 (어구식별→어구탐지, 전역제외→후보제외)
    • vessel:vessel-detail 권한 노드 제거 (드릴다운 전용, 인증만 체크)
    • 공유 리소스 분리: statistics:reports, admin:data-hub, admin:notices 독립 노드 생성
    • V020~V024 마이그레이션 5건
  • 프론트엔드 동적 메뉴/라우팅 — DB 기반 자동 구성
    • menuStore(Zustand) + componentRegistry(lazy loading) + iconRegistry
    • NAV_ENTRIES/PATH_TO_RESOURCE 하드코딩 제거
    • App.tsx DynamicRoutes: DB menuConfig에서 Route 자동 생성
    • MainLayout: DB menuConfig에서 사이드바 자동 렌더링
  • PermissionsPanel 개선 — DB labels 기반 표시명 + 페이지/패널 아이콘 구분 + 메뉴 순서 정렬
  • DB migration README.md 전면 재작성 — V001~V024, 49테이블, 149인덱스 실측 문서화
  • Dark Vessel 의심 점수화 — 기존 "gap≥30분→dark" 이분법에서 8가지 패턴 기반 0~100점 점수 산출 + CRITICAL/HIGH/WATCH/NONE 등급 분류
    • P1 이동 중 OFF / P2 민감 수역 / P3 반복 이력(7일) / P4 거리 비정상 / P5 주간 조업 OFF / P6 직전 이상행동 / P7 무허가 / P8 장기 gap
    • 한국 AIS 수신 커버리지 밖은 자연 gap 가능성으로 감점
    • 어구(gear) AIS, 한국 선박(440/441) dark 판정 완전 제외
    • features JSONB에 dark_suspicion_score, dark_patterns, dark_tier, dark_history_7d 등 저장
  • Transshipment 베테랑 관점 재설계 — 점수 기반 40~130점 판정 (CRITICAL/HIGH/WATCH)
    • SOG 2.0→1.0kn, 근접 110→77m, 지속 60→45분 + gap tolerance 2사이클
    • 한국 EEZ 관할 수역 이내 필수, 어구/여객/군함/유조 제외
    • 야간·무허가·COG편차·장기지속·영해위치 가점
    • pair_history 구조 확장: {'first_seen', 'last_seen', 'miss_count'} (GPS 노이즈 내성)

변경

  • event_generator.py INSERT에 features JSONB 추가 (이벤트에 분석 핵심 특성 저장)
  • @RequirePermission 12곳 수정 — 삭제된 그룹 rsrc_cd → 구체적 자식 리소스
  • EnforcementController vesselMmsi 필터 파라미터 추가
  • enforcement.ts getEnforcementRecords에 vesselMmsi 파라미터 추가
  • stats_aggregator hourly: UTC→KST hour boundary 전환, by_category/by_zone JSONB 집계 추가
  • event_generator 룰 전면 재편:
    • EEZ_INTRUSION: 실측 zone_code(TERRITORIAL_SEA/CONTIGUOUS_ZONE/ZONE_*) 기반 신규 3룰
    • HIGH_RISK_VESSEL: risk.py CRITICAL 임계값과 동일(70점) 연동, 50~69점 MEDIUM 분리
    • DARK_VESSEL: features.dark_tier 기반 CRITICAL/HIGH 룰 (기존 gap>60 룰 교체)
    • ILLEGAL_TRANSSHIP: features.transship_tier 기반 CRITICAL/HIGH 룰 (기존 단순 룰 교체)
    • break 제거 → mmsi당 복수 카테고리 동시 매칭 가능
    • dedup 윈도우 prime 값 분산 (60/120/360→67/127/367 등, 정시 일제 만료 회피)
  • lightweight path 신호 보강: vessel_store 24h 궤적으로 dark/spoofing/speed_jump 산출
  • compute_lightweight_risk_score에 dark gap + spoofing 가점 추가 (max 60→100)
  • _gear_re 중복 제거 → fleet_tracker.GEAR_PATTERN SSOT 통합
  • AnalysisResult.to_db_tuple features sanitize: 중첩 dict/list 지원

수정

  • /map-control labelKey 중복 해소 (nav.riskMap → nav.mapControl, "해역 관리")
  • system-flow 08-frontend.json 누락 노드 14개 추가
  • prediction_stats_hourly.by_category/by_zone 영구 NULL → 채움
  • prediction_stats_hourly.critical_count 영구 0 → CRITICAL 이벤트 수 반영
  • prediction_events 카테고리 2종(ZONE_DEPARTURE/ILLEGAL_TRANSSHIP)만 → 6종 이상
  • KPI dark_vessel/eez_violation 영구 0 → 정상 집계
  • 이벤트 홀수/짝수시 4~22배 진폭 → dedup prime 분산으로 완화
  • dark 과다 판정 해소: 핫픽스(한국 수신 영역 필터) + 2차(의심 점수화)
  • transship 과다 판정 해소: 사이클당 2,400~12,600 → CRITICAL/HIGH/WATCH 점수 기반

문서

  • i18n darkTier/transshipTier/adminSubGroup/mapControl 키 추가 (ko/en)

[2026-04-08]

추가

  • 디자인 시스템 쇼케이스 (/design-system.html) — UI 단일 진실 공급원(SSOT)
    • 별도 Vite entry, 메인 SPA와 분리 (designSystem-*.js 54KB)
    • 10개 섹션: Intro / Token / Typography / Badge / Button / Form / Card / Layout / Catalog / Guide
    • 추적 ID 체계 TRK-<카테고리>-<슬러그> (예: TRK-BADGE-critical-sm)
    • 호버 시 툴팁, "ID 복사 모드", URL 해시 딥링크 #trk=...
    • 단축키 A로 다크/라이트 토글
    • 한글/영문 라벨 병기로 카탈로그 검토 용이
  • 신규 공통 컴포넌트:
    • Button (5 variant × 3 size = 15) @shared/components/ui/button
    • Input / Select / Textarea / Checkbox / Radio @shared/components/ui/
    • TabBar / TabButton (underline / pill / segmented 3 variant) @shared/components/ui/tabs
    • PageContainer (size sm/md/lg + fullBleed) @shared/components/layout/PageContainer
    • PageHeader (icon + title + description + demo + actions) @shared/components/layout/PageHeader
    • Section (Card 단축) @shared/components/layout/Section
  • 중앙 레지스트리:
    • catalogRegistry.ts — 23개 카탈로그 메타 (id/title/description/source/items 자동 enumerate)
    • variantMeta.ts — Badge intent 8종 + Button variant 5종 의미 가이드
    • statusIntent.ts — 한글/영문 ad-hoc 상태 → BadgeIntent + getRiskIntent(0~100)
  • 4 catalog에 intent 필드 추가: eventStatuses / enforcementResults / enforcementActions / patrolStatuses + getXxxIntent() 헬퍼
  • UI 공통 카탈로그 19종 (frontend/src/shared/constants/) — 백엔드 enum/code_master 기반 SSOT
    • violation/alert/event/enforcement/patrol/engine/userRole/device/parentResolution/ modelDeployment/gearGroup/darkVessel/httpStatus/userAccount/loginResult/permission/ vesselAnalysis/connection/trainingZone + kpiUiMap
    • 표준 API: get{Cat}Intent(code), get{Cat}Label(code, t, lang), get{Cat}Classes/Hex
  • 시맨틱 텍스트 토큰 (theme.css @layer utilities) — Tailwind v4 복합 이름 매핑 실패 대응
    • text-heading/label/hint/on-vivid/on-bright, bg-surface-raised/overlay 직접 정의
  • Badge 시스템 재구축 — CVA 기반 8 intent × 4 size (rem), !important 제거
  • cn() 유틸 (lib/utils/cn.ts) — clsx + tailwind-merge, 시맨틱 토큰 classGroup 등록
  • ColorPicker 컴포넌트 — 팔레트 grid + native color + hex 입력
  • Role.colorHex (백엔드 V017 migration) — auth_role.color_hex VARCHAR(7), 빌트인 5개 역할 기본 색상 시드
  • System Flow 뷰어 (/system-flow.html) — 시스템 전체 데이터 흐름 시각화
    • 102 노드 + 133 엣지, 10개 카테고리 매니페스트
    • stage/menu 두 가지 그룹화 토글, 검색/필터/딥링크 지원
    • 포커스 모드 (1-hop 연결 노드만 활성화, 나머지 dim)
    • 메인 SPA와 분리된 별도 entry, 산출문서 노드 ID 참조용
    • /version 스킬 사후 처리로 manifest version 자동 동기화
    • CI/CD에서 버전별 스냅샷을 서버 archive에 영구 보존
  • 백엔드 GET /api/stats/hourly?hours=24 — 시간별 통계 조회 (PredictionStatsHourly)
  • V014 prediction 보조 테이블 12개 (fleet_vessels, gear_correlation_scores 등)
  • V015 NUMERIC precision 일괄 확대 (score→7,4, pct→12,2)
  • V016 parent workflow 누락 컬럼 일괄 추가 (17+ 컬럼, candidate_mmsi generated column)

변경

  • 35+ feature 페이지 PageContainer/PageHeader 마이그레이션 — admin/detection/enforcement/field-ops/patrol/statistics/ai-operations/parent-inference/dashboard/monitoring/surveillance/vessel/risk-assessment 전체
  • VesselDetail -m-4 negative margin 해킹 → <PageContainer fullBleed> 정리
  • LiveMapView fullBleed 패턴 적용
  • Badge intent 팔레트 테마 분리: 라이트(파스텔 bg-X-100 text-X-900) + 다크(translucent bg-X-500/20 text-X-400)
  • 40+ 페이지 Badge/시맨틱 토큰 마이그레이션
    • Badge className 직접 작성 → intent/size prop 변환
    • 컬러풀 액션 버튼 → text-on-vivid (흰색), 검색/필터 버튼 → bg-blue-400 text-on-bright
    • ROLE_COLORS 4곳 중복 제거 → getRoleBadgeStyle() 공통 호출
    • PermissionsPanel 역할 생성/수정에 ColorPicker 통합
  • DataTable width 의미 변경: 고정 → 선호 최소 너비 (minWidth), 컨텐츠 자동 확장 + truncate
  • dateFormat.ts sv-SE 로케일로 YYYY-MM-DD HH:mm:ss 일관된 KST 출력
  • MonitoringDashboard PagePagination 제거 (데이터 페이지네이션 오해 해소)

수정

  • 접근성 (WCAG 2.1 Level A) — axe DevTools 위반 전수 처리:
    • <Select> 컴포넌트 TypeScript union 타입으로 aria-label/aria-labelledby/title 컴파일 강제
    • 네이티브 <select> 5곳 aria-label
    • 아이콘 전용 <button> 16곳 aria-label
    • <input>/<textarea> 28곳 aria-label (placeholder 자동 복제 포함)
    • AIModelManagement 토글 → role="switch" + aria-checked
  • Badge className 위반 37건 전수 제거<Badge intent="..."> 패턴으로 통일
  • 하드코딩 bg-X-500/20 text-X-400 56곳 제거 — 카탈로그 API + intent 사용
  • 인라인 <button> type 누락 86곳 보정
  • CSS Safari 호환성: backdrop-filter -webkit- prefix 추가 (디자인 쇼케이스)
  • trk-pulse keyframe outline-color → opacity (composite-only 최적화)
  • Dashboard RiskBar 단위 버그 (0~100 정수를 *100 하던 코드 → 범위 감지)
  • ReportManagement, TransferDetection p-5 space-y-4 padding 복구
  • EnforcementHistory 그리드 minmax 적용으로 컬럼 잘림 해소
  • timeline 시간 formatDateTime 적용 (ISO T 구분자 처리)
  • prediction e2e 5가지 이슈 수정 (2026-04-08)
    • gear_correlation: psycopg2 Decimal × float TypeError → _load_all_scores() float 변환
    • violation_classifier: (mmsi, analyzed_at) 기준 UPDATE + 중국선박 EEZ 판정 로직
    • kpi_writer / stats_aggregator: UTC → KST 날짜 경계 통일
    • parent workflow 스키마 ↔ 코드 불일치 → V016로 일괄 해결
  • DemoQuickLogin hostname 기반 노출 (Gitea CI .env 차단 대응)
  • 프론트 전수 mock 정리: eventStore.alerts, enforcementStore.plans, transferStore 완전 제거
  • Dashboard/MonitoringDashboard/Statistics 하드코딩 → 실 API 전환
  • UTC → KST 시간 표시 통일 (@shared/utils/dateFormat.ts 공통 유틸)
  • i18n group.parentInference JSON 중복키 제거
  • RiskMap Math.random() 격자 제거, MTIS 라벨 + "AI 분석 데이터 수집 중" 안내
  • 12개 mock 화면에 "데모 데이터" 노란 배지 추가

[2026-04-07]

추가

  • 모노레포 구조 전환 (frontend/ + backend/ + prediction/ + database/)
  • Spring Boot 백엔드 초기화 + Flyway DB 마이그레이션 (V001~V013)
  • 자체 인증 시스템 (JWT + 트리 기반 RBAC + 감사로그 + 데모 계정)
  • 모선 워크플로우 + 관리자 화면 + 권한 라우트 가드
  • 권한 관리 UI 고도화 (트리 RBAC PermissionsPanel)
  • iran 백엔드 실연결 + 시스템 상태 + AI 채팅 기반 구현
  • 마스터 데이터 + prediction 기반 DB 스키마 (V008~V013)
  • 백엔드 API — 이벤트/통계/단속/마스터 데이터 CRUD
  • prediction 분석 엔진 모노레포 이식 (14개 알고리즘, 7단계 파이프라인)
  • prediction 출력 모듈 5종 (이벤트/위반/KPI/통계/경보)
  • alerts API + AIAlert/Dashboard 위험선박 실데이터 전환
  • VesselDetail + LiveMapView 실데이터 전환
  • 프론트 15개 화면 실데이터 연동 (EventList, Statistics, Dashboard 등)
  • 배포 환경 구성 (rocky-211 백엔드 + redis-211 prediction + nginx 프록시)

수정

  • prediction_stats_monthly.stat_month CHAR(7) → DATE 타입 변경
  • 권한 트리 UX 개선 + 라벨 사이드바 일치 + EXPORT 가드

변경

  • 시스템 관리 페이지 백엔드 연결 + 메트릭 카드

문서

  • 배포 문서 보강 + CI/CD 모노레포 수정

기타

  • 팀 워크플로우 초기화 + Prettier + 타입 에러 수정
  • .env 파일 서버 정책 준수 + pre-commit 모노레포 대응