기존 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>