# Release Notes 이 문서는 [Keep a Changelog](https://keepachangelog.com/ko/1.0.0/) 형식을 따릅니다. ## [Unreleased] ## [2026-04-13.2] ### 변경 - **LGCNS 3개 페이지 디자인 시스템 전환** — LGCNSMLOps/AISecurityPage/AIAgentSecurityPage 공통 구조 적용 - 커스텀 탭 → TabBar/TabButton 공통 컴포넌트 교체 - hex 색상 맵 → Tailwind 토큰, `style={{ }}` 인라인 제거 - 인라인 Badge intent 삼항 → 카탈로그 함수 교체 (getAgentPermTypeIntent 등) - 신규 카탈로그 4종: MLOps Job 상태, AI 위협 수준, Agent 권한 유형, Agent 실행 결과 - catalogRegistry 등록 → design-system.html 쇼케이스 자동 노출 ## [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.2] ### 추가 - **워크플로우 연결 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인덱스 실측 문서화 ### 변경 - **event_generator.py** INSERT에 features JSONB 추가 (이벤트에 분석 핵심 특성 저장) - **@RequirePermission 12곳 수정** — 삭제된 그룹 rsrc_cd → 구체적 자식 리소스 - **EnforcementController** vesselMmsi 필터 파라미터 추가 - **enforcement.ts** getEnforcementRecords에 vesselMmsi 파라미터 추가 ### 수정 - `/map-control` labelKey 중복 해소 (nav.riskMap → nav.mapControl, "해역 관리") - system-flow 08-frontend.json 누락 노드 14개 추가 ### 문서 - i18n darkTier/transshipTier/adminSubGroup/mapControl 키 추가 (ko/en) ## [2026-04-09] ### 추가 - **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 노이즈 내성) ### 변경 - **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 지원 ### 수정 - `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 점수 기반 ## [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 해킹 → ``** 정리 - **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 위반 전수 처리: - `` 5곳 aria-label - 아이콘 전용 `