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
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
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
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
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
a498cfdbe7
docs: 릴리즈 노트 [Unreleased] 메뉴 DB SSOT 항목 추가
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 16:02:55 +09:00
1147b96b00
docs: 워크플로우 연결 릴리즈 노트 [Unreleased] 갱신
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 12:17:17 +09:00
037ae363a1
docs: 릴리즈 노트 정리 (2026-04-09)
2026-04-09 09:57:52 +09:00