Compare commits

..

13 커밋

작성자 SHA1 메시지 날짜
50d816e2ff Merge pull request 'release: 2026-04-20 (37건 커밋)' (#89) from release/2026-04-20 into main
All checks were successful
Build and Deploy KCG AI Monitoring (Frontend) / build-and-deploy (push) Successful in 21s
2026-04-20 06:56:08 +09:00
594741906b Merge pull request 'release: 2026-04-17.4 (14건 커밋)' (#81) from develop into main 2026-04-17 07:43:28 +09:00
5be83d2d9a Merge pull request 'release: 2026-04-17.3 (19건 커밋)' (#77) from develop into main 2026-04-17 07:36:56 +09:00
fafed8ccdf Merge pull request 'release: 2026-04-17.2 (5건 커밋)' (#75) from develop into main
All checks were successful
Build and Deploy KCG AI Monitoring (Frontend) / build-and-deploy (push) Successful in 15s
2026-04-17 07:19:51 +09:00
62d14fc519 Merge pull request 'release: 2026-04-17 (11건 커밋)' (#72) from develop into main
All checks were successful
Build and Deploy KCG AI Monitoring (Frontend) / build-and-deploy (push) Successful in 16s
2026-04-17 05:39:15 +09:00
c8673246f3 Merge pull request 'release: 2026-04-16.7 (4건 커밋)' (#67) from develop into main
All checks were successful
Build and Deploy KCG AI Monitoring (Frontend) / build-and-deploy (push) Successful in 15s
2026-04-16 15:26:34 +09:00
2f94c2a0a4 Merge pull request 'release: 2026-04-16.6 (5건 커밋)' (#64) from develop into main
All checks were successful
Build and Deploy KCG AI Monitoring (Frontend) / build-and-deploy (push) Successful in 15s
2026-04-16 14:40:48 +09:00
d0c8a88f21 Merge pull request 'release: 2026-04-16.5 (Phase 1-B admin DS)' (#61) from develop into main
All checks were successful
Build and Deploy KCG AI Monitoring (Frontend) / build-and-deploy (push) Successful in 16s
2026-04-16 11:37:36 +09:00
7d101604cc Merge pull request 'release: 2026-04-16.4 (50건 커밋)' (#58) from develop into main 2026-04-16 11:10:45 +09:00
020b3b7643 Merge pull request 'release: 2026-04-16.3 (6건 커밋) — Admin 디자인 시스템 Phase 1-A' (#55) from develop into main
All checks were successful
Build and Deploy KCG AI Monitoring (Frontend) / build-and-deploy (push) Successful in 15s
2026-04-16 08:45:02 +09:00
21b5048a9c Merge pull request 'release: 2026-04-16.2 — 성능 모니터링 + DAR-10/11 + DAR-03 어구 비교' (#52) from release/2026-04-16.2-main into main
All checks were successful
Build and Deploy KCG AI Monitoring (Frontend) / build-and-deploy (push) Successful in 15s
2026-04-16 08:21:43 +09:00
74bdfa3f04 Merge branch 'main' into release/2026-04-16.2-main 2026-04-16 08:21:09 +09:00
6c7c0f4ca6 Merge pull request 'release: 2026-04-16 (20건 커밋) — DAR-03 탐지 보강 + 한중어업협정 906척 레지스트리' (#47) from develop into main 2026-04-16 07:49:39 +09:00
6개의 변경된 파일17개의 추가작업 그리고 92개의 파일을 삭제

파일 보기

@ -4,9 +4,6 @@
## [Unreleased] ## [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] ## [2026-04-20]
### 추가 ### 추가

파일 보기

@ -318,7 +318,7 @@ deps 변경 → useMapLayers → RAF → overlay.setProps() (React 리렌
--- ---
## 라우팅 구조 (29 보호 경로 + login) ## 라우팅 구조 (27 보호 경로 + login)
`App.tsx`에서 `BrowserRouter` > `AuthProvider` > `Routes`로 구성된다. `App.tsx`에서 `BrowserRouter` > `AuthProvider` > `Routes`로 구성된다.
@ -332,8 +332,6 @@ deps 변경 → useMapLayers → RAF → overlay.setProps() (React 리렌
- `/dark-vessel` — 무등화 선박 탐지 (SFR-09) - `/dark-vessel` — 무등화 선박 탐지 (SFR-09)
- `/gear-detection` — 어구 탐지 (SFR-10) - `/gear-detection` — 어구 탐지 (SFR-10)
- `/gear-collision` — 어구 정체성 충돌 (SFR-10, V030 — 동일 어구 이름 × 복수 MMSI 공존 감지) - `/gear-collision` — 어구 정체성 충돌 (SFR-10, V030 — 동일 어구 이름 × 복수 MMSI 공존 감지)
- `/illegal-fishing` — 불법 조업 이벤트 통합 대시보드 (SFR-09/10/11, V032 — GEAR_ILLEGAL+EEZ_INTRUSION+ZONE_DEPARTURE 3 카테고리)
- `/transshipment` — 환적 의심 전용 탐지 대시보드 (SFR-09, V033 — prediction 5단계 필터 결과)
- `/china-fishing` — 중국어선 탐지 - `/china-fishing` — 중국어선 탐지
- `/patrol-route` — 순찰경로 (SFR-07) - `/patrol-route` — 순찰경로 (SFR-07)
- `/fleet-optimization` — 함대 최적화 (SFR-08) - `/fleet-optimization` — 함대 최적화 (SFR-08)

파일 보기

@ -180,10 +180,10 @@ def _stage(name: str, fn, *args, required=False, **kwargs):
### P1 — 지금 해야 할 것 (운영 안정성) ### P1 — 지금 해야 할 것 (운영 안정성)
1. **사이클 스테이지 단위 에러 경계** (2026-04-20 PR #83 완료) — `prediction/pipeline/stage_runner.py``run_stage(name, fn, required=False)` 유틸. 출력 6모듈(violation_classifier / event_generator / kpi_writer / stats_aggregate_hourly/daily / alert_dispatcher) 스테이지별 독립 실행 + 내부 6지점 `logger.warning → logger.exception` 전환. `upsert_results` required=True. **효과 검증**: 이 변경으로 V031 잠복 버그(`candidate_source` VARCHAR(30) 초과) 가 stacktrace 로 즉시 드러나 30분 내 hotfix 로 4시간 누락되던 `gear_group_parent_candidate_snapshots` 갱신 복원 1. **사이클 스테이지 단위 에러 경계** `_stage(name, fn, required=False)` 유틸로 9번 출력 5모듈을 쪼갤 것. `logger.exception` 으로 stacktrace 보존. `required=True``fetch_incremental` 같은 fatal 에만 적용 → 실패 시 조기 반환
2. 🟡 **임계값 외부화** (2026-04-20 Phase 1-1 기반 머지, Phase 1-2 구현 대기) — V034 `detection_model_versions.params JSONB` + `correlation_param_models` 일반화. 기반 스키마 + 권한 완료, prediction Model Registry/DAG Executor 구현이 Phase 1-2 작업 2. **임계값 외부화**`correlation_param_models` 패턴을 확장해 `detection_params` 테이블 신설 (algo_name, param_key, value, active_from, active_to). 배포 없이 해상도 튜닝 가능. 운영자 권한으로 접근 시 감사 로그
3. **ILLEGAL_FISHING_PATTERN 전용 페이지** (2026-04-20 PR #85 완료) + ✅ **환적 전용 페이지** (2026-04-20 PR #86 완료) — 둘 다 backend 변경 없이 프론트 전용. `/illegal-fishing` / `/transshipment` 메뉴 신설 + V032/V033 권한 3. **ILLEGAL_FISHING_PATTERN 전용 페이지** + **환적 전용 페이지** — 백엔드 API·DB 는 이미 존재. 프론트만 GearCollisionDetection 패턴으로 추가 (`PageContainer` + `DataTable` + `Badge intent`)
4. **사이클 부분 원자성 명시** — DB 쓰기 경계 문서화. 향후 작업 (별도 `docs/prediction-transactions.md` 또는 architecture.md 확장 예정) 4. **사이클 부분 원자성 명시** — DB 쓰기 경계 문서화 (어디까지가 한 트랜잭션인지). 최소한 [architecture.md](architecture.md) 또는 신설 `docs/prediction-transactions.md` 에 다이어그램
### P2 — 다음 (품질 확보) ### P2 — 다음 (품질 확보)
@ -248,4 +248,3 @@ def _stage(name: str, fn, *args, required=False, **kwargs):
| 일자 | 내용 | | 일자 | 내용 |
|---|---| |---|---|
| 2026-04-17 | 초판 — opus 4.7 독립 리뷰. 구조/방향 중심 + 우선순위별 개선 제안 | | 2026-04-17 | 초판 — opus 4.7 독립 리뷰. 구조/방향 중심 + 우선순위별 개선 제안 |
| 2026-04-20 | Phase 0-1/0-2/0-3 + Phase 1-1 V034 완료 반영. P1 권고 4건 중 3건 (사이클 에러 경계, 2개 UI 페이지) 완료 표시. 임계값 외부화(P1 #2) 는 기반 스키마 V034 머지 상태이며 Phase 1-2 Model Registry + DAG Executor 구현 대기 |

파일 보기

@ -13,9 +13,9 @@
| 레이어 | 기술 | 상태 | | 레이어 | 기술 | 상태 |
|-------|------|------| |-------|------|------|
| Frontend | React 19 + TypeScript 5.9 + Vite 8 + Tailwind CSS 4 + Zustand 5 + MapLibre GL 5 + deck.gl 9 + ECharts 6 + react-i18next | 운영 배포 (rocky-211 nginx) | | Frontend | React 19 + TypeScript 5.9 + Vite 8 + Tailwind CSS 4 + Zustand 5 + MapLibre GL 5 + deck.gl 9 + ECharts 6 + react-i18next | 운영 배포 (rocky-211 nginx) |
| Backend | Spring Boot 3.5.7 + Java 21 + PostgreSQL 14.19 + Flyway V001~V034 + Spring Security + JWT + Caffeine + 트리 RBAC | 운영 (rocky-211 :18080, V034 재배포 대기) | | Backend | Spring Boot 3.5.7 + Java 21 + PostgreSQL 14.19 + Flyway V001~V030 + Spring Security + JWT + Caffeine + 트리 RBAC | 운영 배포 (rocky-211 :18080) |
| Prediction | Python 3.11+ + FastAPI + APScheduler, 17 알고리즘 모듈 + 7단계 분류 파이프라인 + 5 출력/룰 모듈 + **stage_runner 사이클 에러 경계** (Phase 0-1) | 운영 배포 (redis-211 :18092, 5분 주기) | | Prediction | Python 3.11+ + FastAPI + APScheduler, 17 알고리즘 모듈 + 7단계 분류 파이프라인 + 5 출력/룰 모듈 | 운영 배포 (redis-211 :18092, 5분 주기) |
| Database | PostgreSQL `kcgaidb` / 51 → 56 테이블 (V034 반영 후 detection_model_* 5 + 뷰 1) / schema `kcg` + snpdb(AIS 원천) | 운영 (V034 반영 대기) | | Database | PostgreSQL `kcgaidb` / 51 테이블 / schema `kcg` + snpdb(AIS 원천) | 운영 |
| Design System | `/design-system.html` 쇼케이스 SSOT + `shared/constants/` 25개 카탈로그 + `shared/components/ui/` 9개 공통 컴포넌트 | SSOT 전영역 준수 (2026-04-17 PR #C 완료) | | Design System | `/design-system.html` 쇼케이스 SSOT + `shared/constants/` 25개 카탈로그 + `shared/components/ui/` 9개 공통 컴포넌트 | SSOT 전영역 준수 (2026-04-17 PR #C 완료) |
| i18n | 10 네임스페이스 × ko/en, `common.json` 에 aria/error/dialog/message 54키 추가 | alert/confirm/aria-label 하드코딩 제거 완료 (2026-04-17 PR #B) | | i18n | 10 네임스페이스 × ko/en, `common.json` 에 aria/error/dialog/message 54키 추가 | alert/confirm/aria-label 하드코딩 제거 완료 (2026-04-17 PR #B) |
@ -86,8 +86,8 @@ Frontend ← Backend /api/analysis/* + /api/events + /api/alerts + ... (65+ API)
| SFR-06 | 단속 계획·경보 연계 | EnforcementPlan | ✅ /api/enforcement/plans | - | | SFR-06 | 단속 계획·경보 연계 | EnforcementPlan | ✅ /api/enforcement/plans | - |
| SFR-07 | AI 경비함정 단일 함정 순찰·경로 | PatrolRoute | 🔲 Mock | - | | SFR-07 | AI 경비함정 단일 함정 순찰·경로 | PatrolRoute | 🔲 Mock | - |
| SFR-08 | AI 경비함정 다함정 협력형 경로 | FleetOptimization | 🔲 Mock | - | | SFR-08 | AI 경비함정 다함정 협력형 경로 | FleetOptimization | 🔲 Mock | - |
| SFR-09 | 불법 어선 패턴 탐지 (Dark Vessel) | DarkVesselDetection, TransferDetection, **TransshipmentDetection(V033)** | ✅ /api/analysis/* | ✅ Dark 11패턴 + Transship 5단계 | | SFR-09 | 불법 어선 패턴 탐지 (Dark Vessel) | DarkVesselDetection, TransferDetection | ✅ /api/analysis/* | ✅ Dark 11패턴 + Transship 5단계 |
| SFR-10 | 불법 어망·어구 탐지 및 관리 | GearDetection, GearIdentification, GearCollisionDetection(V030), **IllegalFishingPattern(V032)** | ✅ /api/vessel-analysis/groups + /api/analysis/gear-detections + /api/analysis/gear-collisions + /api/events?category= | ✅ DAR-03 G-01~G-06 + pair tier + GEAR_IDENTITY_COLLISION(PR #73) | | SFR-10 | 불법 어망·어구 탐지 및 관리 | GearDetection, GearIdentification, GearCollisionDetection(V030) | ✅ /api/vessel-analysis/groups + /api/analysis/gear-detections + /api/analysis/gear-collisions | ✅ DAR-03 G-01~G-06 + pair tier + GEAR_IDENTITY_COLLISION(PR #73) |
| SFR-11 | 단속·탐지 이력 관리 | EnforcementHistory, EventList | ✅ /api/events + /api/enforcement/records | ✅ prediction_events | | SFR-11 | 단속·탐지 이력 관리 | EnforcementHistory, EventList | ✅ /api/events + /api/enforcement/records | ✅ prediction_events |
| SFR-12 | 모니터링 및 경보 현황판 | Dashboard, MonitoringDashboard, ChinaFishing | ✅ /api/stats + /api/alerts + /api/analysis/* | ✅ prediction_kpi_realtime + stats | | SFR-12 | 모니터링 및 경보 현황판 | Dashboard, MonitoringDashboard, ChinaFishing | ✅ /api/stats + /api/alerts + /api/analysis/* | ✅ prediction_kpi_realtime + stats |
| SFR-13 | 통계·지표·성과 분석 | Statistics | ✅ /api/stats (daily/monthly/hourly) | ✅ prediction_stats_* | | SFR-13 | 통계·지표·성과 분석 | Statistics | ✅ /api/stats (daily/monthly/hourly) | ✅ prediction_stats_* |
@ -228,7 +228,7 @@ Frontend ← Backend /api/analysis/* + /api/events + /api/alerts + ... (65+ API)
**제안요청서 정의:** AIS 끊김·스푸핑·환적 등 의심 패턴 탐지. **제안요청서 정의:** AIS 끊김·스푸핑·환적 등 의심 패턴 탐지.
**구현 화면:** `features/detection/DarkVesselDetection.tsx`, `features/detection/TransshipmentDetection.tsx`(V033/PR #86, 2026-04-20), `features/vessel/TransferDetection.tsx` **구현 화면:** `features/detection/DarkVesselDetection.tsx`, `features/vessel/TransferDetection.tsx`
**Prediction 연동 ✅ 운영**: **Prediction 연동 ✅ 운영**:
- **Dark Vessel**: 11패턴 P1~P11 기반 0~100점 연속 점수, 4 tier (CRITICAL≥70/HIGH≥50/WATCH≥30/NONE) - **Dark Vessel**: 11패턴 P1~P11 기반 0~100점 연속 점수, 4 tier (CRITICAL≥70/HIGH≥50/WATCH≥30/NONE)
@ -239,7 +239,6 @@ Frontend ← Backend /api/analysis/* + /api/events + /api/alerts + ... (65+ API)
**백엔드 연동 ✅**: `/api/analysis/vessels` + `/api/analysis/dark` + `/api/analysis/transship` + `/api/analysis/history` **백엔드 연동 ✅**: `/api/analysis/vessels` + `/api/analysis/dark` + `/api/analysis/transship` + `/api/analysis/history`
- DarkDetailPanel: ScoreBreakdown + P1~P11 카탈로그 - DarkDetailPanel: ScoreBreakdown + P1~P11 카탈로그
- 2026-04-17 alertLevels 헬퍼(`ALERT_LEVEL_TIER_SCORE` 등) 적용 - 2026-04-17 alertLevels 헬퍼(`ALERT_LEVEL_TIER_SCORE` 등) 적용
- **TransshipmentDetection 전용 페이지 (V033, 2026-04-20)** — 5단계 필터 결과 목록·집계·상세 READ 전용 대시보드. `/api/analysis/transship` + `getTransshipSuspects` 재사용, features.transship_tier 로 tier 분류 (CRITICAL/HIGH/MEDIUM)
--- ---
@ -259,7 +258,6 @@ Frontend ← Backend /api/analysis/* + /api/events + /api/alerts + ... (65+ API)
- 페어 탐색 `find_pair_candidates` (bbox + 궤적 유사도 2차) - 페어 탐색 `find_pair_candidates` (bbox + 궤적 유사도 2차)
- 한중어업협정 906척 NAME_EXACT + NAME_FUZZY 매칭 53%+ - 한중어업협정 906척 NAME_EXACT + NAME_FUZZY 매칭 53%+
- **GEAR_IDENTITY_COLLISION (V030/PR #73)** — 동일 어구 이름이 서로 다른 MMSI 로 동일 사이클 내 공존 감지 → `gear_identity_collisions` UPSERT(name, mmsi_lo, mmsi_hi), CRITICAL/HIGH/MEDIUM/LOW severity 분류. 이전 "교체(sequential)" 로 오해하던 케이스를 "어구 복제/스푸핑 증거" 로 재정의. SAVEPOINT + try/except 로 `gear_correlation_scores_pkey` 충돌 격리 - **GEAR_IDENTITY_COLLISION (V030/PR #73)** — 동일 어구 이름이 서로 다른 MMSI 로 동일 사이클 내 공존 감지 → `gear_identity_collisions` UPSERT(name, mmsi_lo, mmsi_hi), CRITICAL/HIGH/MEDIUM/LOW severity 분류. 이전 "교체(sequential)" 로 오해하던 케이스를 "어구 복제/스푸핑 증거" 로 재정의. SAVEPOINT + try/except 로 `gear_correlation_scores_pkey` 충돌 격리
- **IllegalFishingPattern 통합 대시보드 (V032/PR #85, 2026-04-20)**`GEAR_ILLEGAL` + `EEZ_INTRUSION` + `ZONE_DEPARTURE` 3 카테고리 통합 뷰. 기존 `/api/events` 를 category 다중 병렬 호출 + occurredAt desc 머지로 backend 변경 없이 신설. KPI 5장 + 카테고리별 3장 + DataTable 7컬럼 + JSON features 상세 + EventList 네비게이션. 처리 액션은 EventList 경유 (READ 전용)
**백엔드 연동 ✅**: **백엔드 연동 ✅**:
- `/api/vessel-analysis/groups` + `/groups/{key}/detail|correlations|candidates/{mmsi}/metrics|resolve` — 모선 워크플로우 (VesselAnalysisGroupService, 2026-04-17 PARENT_RESOLVE @Auditable 추가) - `/api/vessel-analysis/groups` + `/groups/{key}/detail|correlations|candidates/{mmsi}/metrics|resolve` — 모선 워크플로우 (VesselAnalysisGroupService, 2026-04-17 PARENT_RESOLVE @Auditable 추가)
@ -415,8 +413,8 @@ Frontend ← Backend /api/analysis/* + /api/events + /api/alerts + ... (65+ API)
| SFR-06 | `features/risk-assessment/EnforcementPlan.tsx`, `backend/.../enforcement/EnforcementController+Service.java` | | SFR-06 | `features/risk-assessment/EnforcementPlan.tsx`, `backend/.../enforcement/EnforcementController+Service.java` |
| SFR-07 | `features/patrol/PatrolRoute.tsx` | | SFR-07 | `features/patrol/PatrolRoute.tsx` |
| SFR-08 | `features/patrol/FleetOptimization.tsx` | | SFR-08 | `features/patrol/FleetOptimization.tsx` |
| SFR-09 | `features/detection/DarkVesselDetection.tsx`, `features/detection/components/DarkDetailPanel.tsx`, `features/detection/TransshipmentDetection.tsx`(V033), `features/vessel/TransferDetection.tsx`, `prediction/algorithms/dark_vessel.py`, `spoofing.py`, `transship.py`, `risk.py` | | SFR-09 | `features/detection/DarkVesselDetection.tsx`, `features/detection/components/DarkDetailPanel.tsx`, `features/vessel/TransferDetection.tsx`, `prediction/algorithms/dark_vessel.py`, `spoofing.py`, `transship.py`, `risk.py` |
| SFR-10 | `features/detection/GearDetection.tsx`, `GearIdentification.tsx`, `GearCollisionDetection.tsx`(V030), `IllegalFishingPattern.tsx`(V032), `features/detection/components/GearDetailPanel.tsx`, `GearReplayController.tsx`, `prediction/algorithms/pair_trawl.py`, `gear_violation.py`, `gear_identity.py`(V030), `gear_correlation.py`, `gear_parent_inference.py`, `vessel_type_mapping.py`, `backend/.../analysis/VesselAnalysisGroupService.java`, `GearCollisionController+Service.java`(V030) | | SFR-10 | `features/detection/GearDetection.tsx`, `GearIdentification.tsx`, `GearCollisionDetection.tsx`(V030), `features/detection/components/GearDetailPanel.tsx`, `GearReplayController.tsx`, `prediction/algorithms/pair_trawl.py`, `gear_violation.py`, `gear_identity.py`(V030), `gear_correlation.py`, `gear_parent_inference.py`, `vessel_type_mapping.py`, `backend/.../analysis/VesselAnalysisGroupService.java`, `GearCollisionController+Service.java`(V030) |
| SFR-11 | `features/enforcement/EnforcementHistory.tsx`, `EventList.tsx`, `backend/.../event/EventController+Service.java`, `AlertService.java`, `enforcement/EnforcementService.java` | | SFR-11 | `features/enforcement/EnforcementHistory.tsx`, `EventList.tsx`, `backend/.../event/EventController+Service.java`, `AlertService.java`, `enforcement/EnforcementService.java` |
| SFR-12 | `features/dashboard/Dashboard.tsx`, `features/monitoring/MonitoringDashboard.tsx`, `features/detection/ChinaFishing.tsx`, `features/detection/components/VesselMiniMap.tsx`, `VesselAnomalyPanel.tsx`, `backend/.../analysis/VesselAnalysisController+Service.java` | | SFR-12 | `features/dashboard/Dashboard.tsx`, `features/monitoring/MonitoringDashboard.tsx`, `features/detection/ChinaFishing.tsx`, `features/detection/components/VesselMiniMap.tsx`, `VesselAnomalyPanel.tsx`, `backend/.../analysis/VesselAnalysisController+Service.java` |
| SFR-13 | `features/statistics/Statistics.tsx`, `ReportManagement.tsx`, `backend/.../stats/`, `admin/AdminStatsService.java` | | SFR-13 | `features/statistics/Statistics.tsx`, `ReportManagement.tsx`, `backend/.../stats/`, `admin/AdminStatsService.java` |

파일 보기

@ -481,68 +481,6 @@ AIS(선박자동식별장치) 신호를 의도적으로 끈 의심 선박(Dark V
--- ---
### 불법 조업 이벤트 (V032, 2026-04-20 추가)
**메뉴 위치:** 탐지/분석 > 불법 조업 이벤트
**URL:** `/illegal-fishing`
**접근 권한:** ADMIN, OPERATOR, ANALYST, FIELD, VIEWER (READ 전용)
**화면 설명:**
prediction 이 생산하는 **불법 조업 의심 이벤트 3 종을 한 화면에서 통합 조회**하는 READ 전용 대시보드입니다. 처리 액션(확인/상태변경/단속 등록)은 기존 `/event-list` 이벤트 목록에서 수행합니다.
**통합 대상 카테고리:**
- **어구 위반 (GEAR_ILLEGAL)** — G-01 수역-어구 불일치 · G-05 고정어구 drift · G-06 쌍끌이 공조
- **영해/접속수역 침범 (EEZ_INTRUSION)** — 영해 침범(CRITICAL) · 접속수역 + 고위험
- **특정수역 진입 (ZONE_DEPARTURE)** — ZONE_I~IV 진입 + 위험도 40점 이상
**주요 기능:**
- 심각도별 KPI 5장 (전체 / CRITICAL / HIGH / MEDIUM / LOW)
- 카테고리별 건수 3장 + 설명
- 이벤트 목록 7컬럼 (발생시각 / 심각도 / 카테고리 / 제목 / MMSI / 수역 / 상태)
- 필터: 카테고리 (단일 또는 전체 3 카테고리 병합) / 심각도 / MMSI 검색
- 이벤트 상세 패널 — features JSON 원본 + `EventList 에서 열기` 네비게이션
**구현 완료 (2026-04-20 기준):**
- ✅ 기존 `/api/events?category=X` 를 3 카테고리에 대해 **병렬 호출** 후 occurredAt desc 머지 (backend 변경 없음)
- ✅ `frontend/src/services/illegalFishingPatternApi.ts``listIllegalFishingEvents` 함수 + byCategory/byLevel 집계
- ✅ V032 권한 트리 `detection:illegal-fishing` + 전 역할 READ 부여
**향후 구현 예정:**
- 🔲 직접 처리 액션 (ack / 단속 등록) 추가 — 현재는 EventList 네비게이션만
---
### 환적 의심 탐지 (V033, 2026-04-20 추가)
**메뉴 위치:** 탐지/분석 > 환적 의심 탐지
**URL:** `/transshipment`
**접근 권한:** ADMIN, OPERATOR, ANALYST, FIELD, VIEWER (READ 전용)
**화면 설명:**
prediction 의 **5단계 환적 필터 파이프라인** 결과를 전체 목록·집계·상세 수준으로 조회하는 READ 전용 대시보드입니다. 기존 `features/vessel/TransferDetection.tsx` 는 선박 상세 수준이고, 이 페이지는 **전체 환적 의심 선박 목록 운영 대시보드** 입니다.
**prediction 5단계 필터:**
1. 이종 쌍 (fishing ↔ carrier 매칭)
2. 감시영역 (관심 수역 내부)
3. RENDEZVOUS 90분 이상 접촉
4. 점수 50점 이상
5. 밀집 방폭 (군집 false positive 제거)
**주요 기능:**
- KPI 5장 — 전체 + Transship tier CRITICAL/HIGH/MEDIUM + 종합 위험도 CRITICAL
- 이벤트 목록 8컬럼 (분석시각 / MMSI / 상대 MMSI / 지속분 / Tier / 위험도 / 종합위험 / 수역)
- 필터: 조회기간(1/6/12/24/48h) / 위험도 / MMSI 검색
- 상세 패널 — 환적 점수 + 좌표 + features JSON 원본
**구현 완료 (2026-04-20 기준):**
- ✅ 기존 `/api/analysis/transship` + `getTransshipSuspects` 재사용 (backend 변경 없음)
- ✅ V033 권한 트리 `detection:transshipment` + 전 역할 READ 부여
**향후 구현 예정:**
- 🔲 VesselAnalysisController `/api/analysis/transship`@RequirePermission`detection:transshipment` 로 교체 (현재 `detection:dark-vessel` READ 로 가드 중, 운영자 역할은 양쪽 보유하여 실용 동작)
---
## SFR-11: 단속/탐지 이력 관리 ## SFR-11: 단속/탐지 이력 관리
**메뉴 위치:** 단속/이력 > 단속/탐지 이력 **메뉴 위치:** 단속/이력 > 단속/탐지 이력

파일 보기

@ -10,15 +10,10 @@ KCG AI Monitoring 시스템 워크플로우 플로우차트 뷰어 사용법.
- 메인 SPA(`/`)와 완전 분리된 별도 React 앱 - 메인 SPA(`/`)와 완전 분리된 별도 React 앱
- 메뉴/링크 노출 없음 — 직접 URL 접근만 - 메뉴/링크 노출 없음 — 직접 URL 접근만
> ⚠️ **V030~V034 미반영 경고**: 2026-04-17 V030 (`algo.gear_identity_collision`, > ⚠️ **V030 미반영 경고**: 2026-04-17 V030 로 추가된 GEAR_IDENTITY_COLLISION 파이프라인 (
> `storage.gear_identity_collisions`, `api.gear_collisions_*`, `ui.gear_collision`, > `algo.gear_identity_collision`, `storage.gear_identity_collisions`, `api.gear_collisions_*`,
> `decision.gear_collision_resolve`) + 2026-04-20 V032 (`ui.illegal_fishing`) + V033 > `ui.gear_collision`, `decision.gear_collision_resolve`) 노드가 아직 manifest 에 등록되지
> (`ui.transshipment_detection`) + **V034 Detection Model Registry** > 않았다. 다음 `/version` 릴리즈 시 매니페스트 동기화 필요.
> (`storage.detection_models`, `storage.detection_model_versions`,
> `storage.detection_model_run_outputs`, `storage.detection_model_metrics`,
> `infra.dag_executor`, `infra.shadow_runner`, `api.detection_models_*`,
> `ui.detection_model_management`) 노드들이 아직 manifest 에 등록되지 않았다.
> 다음 `/version` 릴리즈 시 매니페스트 일괄 동기화 필요.
## 접근 URL ## 접근 URL