20806ee80c
fix(prediction): dark_suspicion Adapter 입력 매핑 교정 (run_outputs 0 rows silent)
...
기존 DarkSuspicionModel.run() 이 ctx.inputs[*].features.gap_info.is_dark
로 대상을 필터했으나, 실제 AnalysisResult.features 는 gap_info 키를
포함하지 않고 다음으로 이미 flatten 저장됨:
- dark_suspicion_score (0~100 int)
- dark_tier ('CRITICAL'/'HIGH'/'WATCH'/'NONE')
- dark_patterns (list[str])
- gap_start_state / gap_start_sog / gap_start_lat / gap_start_lon
결과: PRIMARY 승격 + feature flag=1 적용해도 Adapter 가 한 선박도
평가하지 못해 detection_model_run_outputs 에 0 rows 적재 — E2E 검증
에서 evaluated_count=0 메트릭이 silent 조기 포착.
수정: Adapter 를 transshipment/risk/pair_trawl 과 동일한 관찰형으로 재작성.
- row.is_dark 필터 후 기존 결과(score/tier/patterns) JSONB snapshot 기록
- critical/high/watch/none_count + avg_score 메트릭 집계
- input_ref: {mmsi, analyzed_at, gap_min}
운영 반영 후 1 사이클에서 3508 rows 적재 (141 CRITICAL / 467 HIGH /
963 WATCH / avg_score=27.78) 확인.
범위 밖 (후속 PR):
- compute_dark_suspicion 에 ACTIVE 버전 params 를 런타임 주입해 실제
score/tier 재계산하는 scheduler 호출부 리팩토링. 현 상태는 params
카탈로그 관찰까지만 (나머지 4 모델과 동일 수준).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 16:05:38 +09:00
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