fix: vessel_store 타임존 수정 + 모선 추론 이식 + 검토 목록 동기화 #221

병합
htlee bugfix/vessel-store-tz-naive 에서 develop 로 17 commits 를 머지했습니다 2026-04-04 10:28:41 +09:00
소유자

변경 사항

버그 수정

  • vessel_store _last_bucket 타임존 오류 수정 (tz-naive KST 유지)
  • time_bucket 수집 안전 윈도우 도입 (safe_bucket 12분 지연 + 3 bucket 백필)
  • 모선 검토 대기 목록 ↔ 폴리곤 데이터 동기화 문제 해소
    • 검토 대기 목록을 5분 폴링 데이터에서 파생 (별도 API 제거)
    • 초기 로드 시 자동 그룹 선택 제거, 렌더 루프 수정
  • 모선 추론 점수 가중치 조정 — 100%는 DIRECT_PARENT_MATCH 전용
  • prediction proxy를 nginx 경유로 변경

신규 기능

  • 어구 모선 추론(Gear Parent Inference) 시스템 전체 이식
    • Python: 추론 엔진 + Episode 연속성 + 이름 규칙
    • Backend: 15개 API + DB migration 012~015
    • Frontend: 검토 대시보드 + React Flow 흐름도
  • LoginPage DEV_LOGIN 환경변수 지원

기타

  • 후보 소스 배지 축약 (CORRELATION→CORR 등)
  • codex 환경변수 동적화 + @Table schema 제거

변경 규모

  • 17 commits, 90 files changed, +13,292 -504

테스트

  • Backend mvn compile 성공
  • Frontend tsc --noEmit + ESLint 통과
  • Backend + Prediction 서버 배포 완료 (rocky-211, redis-211)
  • 12시간 누적 데이터 검증 완료
## 변경 사항 ### 버그 수정 - vessel_store `_last_bucket` 타임존 오류 수정 (tz-naive KST 유지) - time_bucket 수집 안전 윈도우 도입 (safe_bucket 12분 지연 + 3 bucket 백필) - 모선 검토 대기 목록 ↔ 폴리곤 데이터 동기화 문제 해소 - 검토 대기 목록을 5분 폴링 데이터에서 파생 (별도 API 제거) - 초기 로드 시 자동 그룹 선택 제거, 렌더 루프 수정 - 모선 추론 점수 가중치 조정 — 100%는 DIRECT_PARENT_MATCH 전용 - prediction proxy를 nginx 경유로 변경 ### 신규 기능 - 어구 모선 추론(Gear Parent Inference) 시스템 전체 이식 - Python: 추론 엔진 + Episode 연속성 + 이름 규칙 - Backend: 15개 API + DB migration 012~015 - Frontend: 검토 대시보드 + React Flow 흐름도 - LoginPage DEV_LOGIN 환경변수 지원 ### 기타 - 후보 소스 배지 축약 (CORRELATION→CORR 등) - codex 환경변수 동적화 + @Table schema 제거 ## 변경 규모 - 17 commits, 90 files changed, +13,292 -504 ## 테스트 - [x] Backend mvn compile 성공 - [x] Frontend tsc --noEmit + ESLint 통과 - [x] Backend + Prediction 서버 배포 완료 (rocky-211, redis-211) - [x] 12시간 누적 데이터 검증 완료
htlee added 17 commits 2026-04-04 10:28:14 +09:00
snpdb time_bucket은 tz-naive KST인데 UTC tzinfo를 강제 부여하여
incremental fetch WHERE time_bucket > %s 비교 시 미래 시간으로 해석,
항상 0 rows 반환 → 1h 어구 그룹이 점진적으로 소멸하는 버그.

tz-naive 그대로 유지하도록 수정 (load_initial, merge_incremental 3곳).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Codex 리뷰 지적: timestamp fallback 분기에서 UTC aware 값을
replace(tzinfo=None)로 tz만 제거하면 KST time_bucket과 9시간 어긋남.
astimezone(KST) 후 tz 제거하도록 수정.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ZoneInfo('Asia/Seoul') 사용 시 tzdata 미설치 환경 대비.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
snpdb 5분 버킷 데이터가 적재 완료까지 ~12분 소요되는데,
기존 fetch_incremental이 상한 없이 미완성 버킷을 수집하여
_last_bucket이 조기 전진 → 뒤늦게 완성된 행 영구 누락.

- time_bucket.py 신규: safe_bucket(12분 지연) + backfill(3 bucket)
- snpdb.py: fetch_all_tracks/fetch_incremental에 safe 상한 + 백필 하한
- vessel_store.py: merge_incremental sort+keep='last', evict_stale time_bucket 우선
- config.py: SNPDB_SAFE_DELAY_MIN=12, SNPDB_BACKFILL_BUCKETS=3

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Codex Lab 환경(iran-airstrike-replay-codex)에서 검증 완료된
어구 모선 자동 추론 + 검토 워크플로우 전체를 이식.

## Python (prediction/)
- gear_parent_inference(1,428줄): 다층 점수 모델 (correlation + name + track + prior bonus)
- gear_parent_episode(631줄): Episode 연속성 (Jaccard + 공간거리)
- gear_name_rules: 모선 이름 정규화 + 4자 미만 필터
- scheduler: 추론 호출 단계 추가 (4.8)
- fleet_tracker/kcgdb: SQL qualified_table() 동적화
- gear_correlation: timestamp 필드 추가

## DB (database/migration/ 012~015)
- 후보 스냅샷, resolution, episode, 라벨 세션, 제외 관리 테이블 9개 + VIEW 2개

## Backend (Java)
- 12개 DTO/Controller (ParentInferenceWorkflowController 등)
- GroupPolygonService: parent_resolution LEFT JOIN + 15개 API 메서드

## Frontend
- ParentReviewPanel: 모선 검토 대시보드
- vesselAnalysis: 10개 신규 API 함수 + 6개 타입

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ParentReviewPanel 마운트 + 관련 상태 관리를 FleetClusterLayer에 통합.
리플레이 컨트롤러, 어구 그룹 섹션, 일치율 패널 등 11개 컴포넌트
codex Lab 환경에서 검증된 버전으로 교체.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
parentInference.* 키가 누락되어 UI에 번역 키가 그대로 노출되던 문제.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- polygon_builder: is_trackable_parent_name 필터 추가 (짧은 이름 어구 제외)
- chat/domain_knowledge, chat/tools, db/partition_manager: qualified_table() 적용
- FleetCompanyController: @Value DB_SCHEMA 동적화

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Backend: @Table(schema="kcg") 하드코딩 제거 → application.yml default_schema 활용
- Backend: application.yml/prod.yml 환경변수 ${} 패턴 전환
- Backend: WebConfig CORS 5174 포트 추가
- Frontend: tsconfig resolveJsonModule 추가
- Prediction: scheduler/snpdb/vessel_store import 위치 + 주석 codex 동기화

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- GearParentFlowViewer: React Flow 기반 인터랙티브 흐름도
- gear-parent-flow.html: standalone entry point
- vite.config.ts: multi-entry 빌드 (main + gearParentFlow)
- App.tsx: FLOW 링크 추가
- @xyflow/react 의존성 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
VITE_ENABLE_DEV_LOGIN=true로 프로덕션 빌드에서도 DEV LOGIN 활성화 가능.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
문제: china_bonus(15%) + prior(20%) 가산으로 일반 후보 23.6%가 100% 도달
- china_bonus: 0.15 → 0.05, 적용 조건: pre >= 0.30 → 0.50
- episode_prior: 0.10 → 0.05
- lineage_prior: 0.05 → 0.03
- label_prior: 0.10 → 0.07
- total_prior_cap: 0.20 → 0.10

결과: 일반 후보 최대 ~93% (라벨 있으면 ~98%), 100%는 직접 모선 일치만

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
로컬 dev에서 192.168.1.18(redis-211 내부 IP) 직접 접근 불가 → timeout.
kcg.gc-si.dev nginx 경유로 변경하여 정상 동작.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Backend: LATEST_GROUPS_SQL에 candidateCount CTE 추가 (GroupPolygonDto 확장)
- Frontend: parentInferenceQueue를 별도 API 대신 groupPolygons useMemo 파생으로 전환
- 렌더 루프 수정: refreshParentInferenceQueue deps에서 groupPolygons → polygonRefresh 분리
- 초기 로드 시 자동 그룹 선택 제거, 검토 패널만 표시
- 후보 소스 배지 축약 (CORRELATION→CORR, PREVIOUS_SELECTION→PREV)
- useGroupPolygons에 refresh 콜백 외부 노출

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
claude-bot 이 변경사항을 승인하였습니다. 2026-04-04 10:28:34 +09:00
claude-bot left a comment
멤버

MR 승인 (via /mr skill)

MR 승인 (via /mr skill)
htlee merged commit 7ea5b4719a into develop 2026-04-04 10:28:41 +09:00
htlee 삭제된 브랜치 bugfix/vessel-store-tz-naive 2026-04-04 10:28:42 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 2명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

마감일이 설정되지 않았습니다.

의존성

No dependencies set.

Reference: gc/kcg-monitoring#221
No description provided.