커밋 그래프

63 커밋

작성자 SHA1 메시지 날짜
2e18960bf2 feat(backend): Phase 3 MVP — Detection Model Registry 운영자 API
V034 detection_models / detection_model_versions 에 대한 CRUD 경량 API.
MVP 8 엔드포인트로 Phase 2 PoC 5 모델을 DRAFT→ACTIVE 승격 가능한 최소 범위.

엔드포인트 (/api/ai/detection-models):
- GET  /                                    — 카탈로그 목록
- GET  /{modelId}                           — 단건
- GET  /{modelId}/dependencies              — DAG 선행
- GET  /{modelId}/versions                  — 버전 목록
- GET  /{modelId}/versions/{versionId}      — 버전 상세
- POST /{modelId}/versions                  — DRAFT 생성 [@Auditable]
- POST /.../{versionId}/activate            — DRAFT→ACTIVE(role) [@Auditable]
- POST /.../{versionId}/archive             — ACTIVE/DRAFT→ARCHIVED [@Auditable]

구성 요소 (gc.mda.kcg.domain.ai):
- DetectionModel / DetectionModelVersion 엔티티
  · JSONB params 는 Hibernate @JdbcTypeCode(SqlTypes.JSON) + JsonNode
- DetectionModelRepository / DetectionModelVersionRepository
- DetectionModelService (READ only)
- DetectionModelVersionService (전이 화이트리스트 + uk_detection_model_primary 409)
- 4 DTO record (Response 2, Request 3)

권한: ai-operations:detection-models (V034 에서 이미 seed)
  · READ (전체), CREATE (POST /versions), UPDATE (activate/archive)
  · ADMIN 5 ops / OPERATOR READ+UPDATE / ANALYST·VIEWER READ

검증:
- mvn -q compile 성공 (warning 만, error 없음)
- mvn spring-boot:run 로컬 기동 성공 (포트 8081)
- admin 계정 쿠키 인증으로 8 엔드포인트 전수 smoke test:
  · GET /api/ai/detection-models → 5 모델 (dark/risk/gear/pair/transship) 반환
  · GET /{modelId} 단건 + /dependencies (0 rows) 정상
  · POST /versions (1.0.1-test DRAFT) → activate SHADOW → archive 전이 사이클

후속 PR:
- promote-primary (SHADOW/CHALLENGER→PRIMARY, 기존 PRIMARY 자동 archive)
- enable 토글, metrics / compare / runs 조회

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 13:46:31 +09:00
7ab6baeed2 fix(prediction): stats_aggregator hour 경계 silent 누락 복구
배경: prediction 5분 interval 이지만 한 사이클 평균 13분 소요라
사이클이 hour 경계를 넘나드는 경우(12:55 시작 → 13:08 완료)가 흔하다.
이 때 사이클 내 생성된 이벤트(occurred_at=12:57)가 aggregate_hourly
호출 시점(now_kst=13:08) 기준 현재 hour=13:00 만 UPSERT 되어
12:00 hour 는 이전 사이클 snapshot 으로 stale 유지되는 silent drop.

실제 포착: 2026-04-20 12:50 CRITICAL GEAR_IDENTITY_COLLISION 이벤트가
prediction_stats_hourly.by_category 12:00 slot 에서 누락. Phase 1-2
snapshot 의 C1 drift 섹션이 only_in_events=GEAR_IDENTITY_COLLISION 으로 탐지.

수정:
- _aggregate_one_hour(conn, hour_start, updated_at): 단일 hour UPSERT 추출
- aggregate_hourly(): 호출 시마다 previous→current 순서로 2번 집계
  · UPSERT 라 idempotent
  · 반환값은 현재 hour (하위 호환)
  · target_hour 지정 케이스도 ±1h 재집계

검증:
- 3 유닛테스트 (경계 호출 2건 / 반환값 / 일 경계) 전수 통과
- 운영 수동 재집계로 12:00 slot GEAR_IDENTITY_COLLISION: 1 복구
- snapshot 재실행 시 C1 drift 0 확인

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 13:32:44 +09:00
8f5152fc02 feat(prediction): Phase 2 PoC 2~5 — gear_violation/transshipment/risk/pair_trawl
런타임 override 완성 (params 인자 + 내부 상수 교체):
- gear_violation_g01_g06 (GEAR, tier 4)
  · G01~G06 점수 + signal_cycling(gap_min/min_count)
  · gear_drift_threshold_nm + fixed_gear_types + fishery_code_allowed_gear
  · _detect_signal_cycling_count 도입 (기존 _detect_signal_cycling 보존)

카탈로그 + 관찰 (DEFAULT_PARAMS 노출 + Adapter 집계, 런타임 교체는 후속 PR):
- transshipment_5stage (TRANSSHIP, tier 4) — 5단계 필터 임계
- risk_composite (META, tier 3) — 경량+파이프라인 가중치
- pair_trawl_tier (GEAR, tier 4) — STRONG/PROBABLE/SUSPECT 임계

각 모델 공통:
- prediction/algorithms/*.py: DEFAULT_PARAMS 상수 추가
- models_core/registered/*_model.py: BaseDetectionModel Adapter
- models_core/seeds/v1_<model>.sql: DRAFT seed (호출자 트랜잭션 제어)
- tests/test_<model>_params.py: Python ↔ 모듈 상수 ↔ seed SQL 정적 일치 검증

통합 seed: models_core/seeds/v1_phase2_all.sql (\i 로 5 모델 일괄 시드)

검증:
- 30/30 테스트 통과 (Phase 1-2 15 + dark 5 + Phase 2 신규 10)
- 운영 DB 5 모델 개별 + 일괄 seed dry-run 통과 (BEGIN/ROLLBACK 격리)
- 5 모델 모두 tier/category 정렬 확인: dark_suspicion(3) / risk_composite(3) /
  gear_violation_g01_g06(4) / pair_trawl_tier(4) / transshipment_5stage(4)

후속:
- transshipment/risk/pair_trawl 런타임 override 활성화 (헬퍼 params 전파)
- Phase 3 백엔드 API (DetectionModelController + 승격 엔드포인트)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 10:11:16 +09:00
8c586c3384 feat(prediction): Phase 2 PoC #1 — dark_suspicion 모델 외부화
- algorithms/dark_vessel.py: compute_dark_suspicion 에 params 인자 추가
  · DARK_SUSPICION_DEFAULT_PARAMS 상수(19 가중치 + SOG/반복/gap/tier 임계)
  · _merge_default_params 깊이 병합 — params=None 시 BACK-COMPAT 완전 보장
  · override 가 DEFAULT 를 변조하지 않는 불변성
- models_core/registered/dark_suspicion_model.py: BaseDetectionModel Adapter
  · AnalysisResult 리스트에서 gap_info 재평가
  · evaluated/critical/high/watch_count 메트릭 기록
- models_core/seeds/v1_dark_suspicion.sql: DRAFT seed (운영 영향 0)
  · BEGIN/COMMIT 미포함 — 호출자 트랜잭션 제어 (psql -1 또는 wrap)
  · JSONB params 는 Python DEFAULT 와 1:1 일치
- models_core/seeds/README.md: 실행·승격 절차, 금지 패턴, 롤백
- tests/test_dark_suspicion_params.py: 5건 동치성 검증
  · DEFAULT 형태, None↔DEFAULT 동치성, override 불변성
  · seed SQL JSONB ↔ Python DEFAULT 정적 일치 검증
- 전체 20/20 테스트 통과 (Phase 1-2 기반 15 + Phase 2-1 동치성 5)
- seed SQL 운영 DB dry-run(BEGIN/ROLLBACK) 성공 — INSERT 2건 정상, tier_thresholds 일치 확인

후속: gear_violation_g01_g06 / transshipment_5stage / risk_composite / pair_trawl_tier
는 별도 PR. 각 모델 같은 패턴(params 인자 + DEFAULT 상수 + Adapter + seed).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 08:19:57 +09:00
735521966a docs: 릴리즈 노트 업데이트 (Phase 1-2 detection model registry)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 08:08:44 +09:00
f913953562 docs: 릴리즈 노트 업데이트 2026-04-20 07:11:01 +09:00
04d4b12c50 docs: 2026-04-20 릴리즈 후속 정적 문서 최신화
Phase 0-1/0-2/0-3 + Phase 1-1 V034 반영 + Phase 1-2 재개 포인트 명시.

### 변경
- architecture.md — 27→29 보호 경로, /illegal-fishing + /transshipment 라우트 추가
- sfr-traceability.md
  - Flyway V001~V030 → V001~V034 (34 마이그레이션)
  - Database 51 → 56 테이블 (V034 detection_model_* 5종 + 뷰 1, 반영 대기)
  - Prediction 섹션에 stage_runner 사이클 에러 경계 (Phase 0-1) 추가
  - SFR-09: TransshipmentDetection(V033/PR #86) 페이지 추가
  - SFR-10: IllegalFishingPattern(V032/PR #85) 페이지 추가
  - 부록 A: 신규 화면 파일 경로 반영
- sfr-user-guide.md — SFR-10 하위에 "불법 조업 이벤트" + "환적 의심 탐지" 2개 신규 페이지 사용자 가이드 섹션 신설
- system-flow-guide.md — V030 미반영 경고를 V030~V034 노드 일괄 미반영으로 확장 (detection_models / detection_model_versions / detection_model_run_outputs / detection_model_metrics / dag_executor / shadow_runner / api.detection_models_* / ui.illegal_fishing / ui.transshipment_detection / ui.detection_model_management)
- prediction-analysis.md — P1 권고 4건 중 3건 완료 표시
  -  사이클 스테이지 에러 경계 (PR #83)
  - 🟡 임계값 외부화 (V034 스키마 머지, Phase 1-2 대기)
  -  ILLEGAL_FISHING_PATTERN 전용 페이지 (PR #85)
  -  환적 전용 페이지 (PR #86)
  - 변경 이력에 2026-04-20 행 추가

### 범위 밖
- memory/* 는 세션 로컬 경로, 저장소 외
- prediction/backend 코드 변경 없음 — 문서만
2026-04-20 07:10:48 +09:00
be315f59aa docs: 릴리즈 노트 정리 (2026-04-20) 2026-04-20 06:52:25 +09:00
82ffe7cb06 Merge branch 'develop' into feature/phase1-1-detection-models-schema 2026-04-20 06:48:43 +09:00
d971624090 docs: 릴리즈 노트 업데이트 2026-04-20 06:31:33 +09:00
410d0da9cf docs: 릴리즈 노트 업데이트 2026-04-20 06:22:58 +09:00
a8ce9a4ea9 docs: 릴리즈 노트 업데이트 2026-04-20 05:51:25 +09:00
214f063f1e docs: 릴리즈 노트 업데이트 2026-04-20 05:46:34 +09:00
2b25dc1c92 docs: 릴리즈 노트 업데이트 2026-04-17 11:52:08 +09:00
a32d09f75a docs: 릴리즈 노트 업데이트 2026-04-17 11:28:58 +09:00
451f38036a docs: 릴리즈 노트 업데이트 2026-04-17 11:21:56 +09:00
b37e18d952 docs: prediction-analysis 신규 + 루트/SFR 문서 drift 해소
- docs/prediction-analysis.md 신설 — opus 4.7 독립 리뷰 기반 prediction 구조/방향 심층 분석
  (9개 섹션: 아키텍처·5분 사이클·17 알고리즘·4대 도메인 커버리지·6축 구조 평가·개선 제안 P1~P4·임계값 전수표)
- AGENTS.md / README.md — V001~V016→V030, Python 3.9→3.11+, 14→17 알고리즘 모듈
- docs/architecture.md — /gear-collision 라우트 추가 (26→27 보호 경로)
- docs/sfr-traceability.md — V029→V030, 48→51 테이블, SFR-10 에 GEAR_IDENTITY_COLLISION 추가
- docs/sfr-user-guide.md — 어구 정체성 충돌 페이지 섹션 신설
- docs/system-flow-guide.md — 노드 수 102→115, V030 manifest 미반영 경고
- backend/README.md — "Phase 2 예정" 상태 → 실제 운영 구성 + PR #79 hotfix 요구사항 전면 재작성
2026-04-17 11:20:53 +09:00
b0d9630dde docs: 릴리즈 노트 정리 (2026-04-17.4) 2026-04-17 07:42:44 +09:00
f92810b1b4 docs: 릴리즈 노트 정리 (2026-04-17.3) 2026-04-17 07:34:27 +09:00
9a9388c37a docs: 릴리즈 노트 업데이트 2026-04-17 07:28:14 +09:00
ed48735310 docs: 릴리즈 노트 정리 (2026-04-17.2) 2026-04-17 07:18:19 +09:00
831045ace9 docs: 프로젝트 산출문서 2026-04-17 기준 정비
- docs/architecture.md: shared/components/ui 9개·i18n 네임스페이스 갱신
- docs/sfr-traceability.md: v3.0 전면 재작성 (운영 상태 기반 531 라인)
- docs/sfr-user-guide.md: 헤더 + SFR-01/02/09/10/11/12/13/17 구현 현황 갱신
- docs/data-sharing-analysis.md / next-refactoring.md / page-workflow.md: stale 3건 제거
2026-04-17 06:52:51 +09:00
fe43f6b022 docs: 릴리즈 노트 정리 (2026-04-17) 2026-04-17 05:37:39 +09:00
5731fa30a1 docs: 릴리즈 노트 업데이트 (PR #C 디자인시스템 정비) 2026-04-16 17:09:32 +09:00
03f2ea08db docs: 릴리즈 노트 업데이트 (PR #B i18n 정비) 2026-04-16 16:32:53 +09:00
bb40958858 docs: 릴리즈 노트 업데이트 (PR #A 구조 정비) 2026-04-16 16:19:02 +09:00
9063095a9b docs: 릴리즈 노트 정리 (2026-04-16.7) 2026-04-16 15:25:36 +09:00
3372d06545 docs: 릴리즈 노트 업데이트 2026-04-16 15:22:51 +09:00
49c11e7b4a docs: 릴리즈 노트 정리 (2026-04-16.6) 2026-04-16 14:38:59 +09:00
a9f81c6c7e docs: 릴리즈 노트 업데이트 2026-04-16 14:35:43 +09:00
3248ec581b docs: 릴리즈 노트 정리 (2026-04-16) 2026-04-16 11:37:15 +09:00
f1dc9f7a5a docs: 릴리즈 노트 업데이트 2026-04-16 11:36:22 +09:00
15e17759f8 docs: 릴리즈 노트 정리 (2026-04-16) 2026-04-16 11:09:17 +09:00
20e2b029c5 docs: 릴리즈 노트 업데이트 2026-04-16 11:07:06 +09:00
9c74459acc docs: 릴리즈 노트 정리 (2026-04-16.3) 2026-04-16 08:44:17 +09:00
e6b053dfa2 Merge remote-tracking branch 'origin/develop' into feature/admin-ds-rbac-refactor
# Conflicts:
#	docs/RELEASE-NOTES.md
2026-04-16 08:43:33 +09:00
a68945bd07 docs: 릴리즈 노트 업데이트 2026-04-16 08:40:07 +09:00
77b6fc9b14 docs: 릴리즈 노트 정리 (2026-04-16.2) 2026-04-16 08:03:32 +09:00
dd0a934203 docs: 릴리즈 노트 정리 (2026-04-16) 2026-04-16 07:48:23 +09:00
9d538cffd8 docs: 릴리즈 노트 업데이트 2026-04-16 07:45:14 +09:00
8ff04a8cca feat(prediction): DAR-03 탐지 로직 보강 + 한중어업협정 906척 레지스트리 적재
- V029: kcg.fishery_permit_cn 신규 테이블(연단위, permit_year+permit_no 복합 유니크) + fleet_vessels permit_year/fishery_code 컬럼
- load_fishery_permit_cn.py: xls → DB 적재 스크립트, 906척 + 497 신청인사 upsert
- G-04/G-05/G-06 Dead code 해결: classify_gear_violations 호출 연결, dir() 버그 제거
- find_pair_candidates: bbox 1차 + 궤적 유사도(location/sog_corr/cog_alignment) 2차, role 가점
- spoofing 산식 교체: 1시간 윈도우 + teleport 절대 가점 + extreme 50kn 단독 0.6 확정
- transshipment 선종 완화: shipTy 부분일치 + 412* FISHING 간주
- gear_code DB write 경로 신설 + fleet_tracker API 3개 추가
- cron 스크립트: fishery_permit/pair_type/fleet_role 신규 섹션
2026-04-16 07:43:24 +09:00
1cc4c9dfd7 docs: 릴리즈 노트 정리 (2026-04-15) 2026-04-15 13:42:06 +09:00
52ac478069 docs: 릴리즈 노트 [Unreleased] DAR-03 + 모선 검토 + 리플레이 항목 추가 2026-04-15 13:29:01 +09:00
9076797699 docs: 릴리즈 노트 정리 (2026-04-14)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 08:20:30 +09:00
56af7690fb docs: 릴리즈 노트 [Unreleased] 탐지 워크플로우 UI 항목 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 08:09:34 +09:00
6f68dce380 docs: 릴리즈 노트 정리 (2026-04-13.2)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:50:31 +09:00
feb28dbb85 docs: 릴리즈 노트 [Unreleased] LGCNS 디자인 시스템 전환 항목 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:45:42 +09:00
2eddd01d17 docs: 릴리즈 노트 정리 (2026-04-13)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:14:44 +09:00
df75e085a7 docs: 릴리즈 노트 [Unreleased] LGCNS MLOps + AI 보안 메뉴 항목 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:12:19 +09:00
a08071edce docs: 릴리즈 노트 정리 (2026-04-09.2)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 16:04:10 +09:00