# 📋 T-FIX-SOM-RACE — DevLog v1.0

> # 📋 T-FIX-SOM-RACE — DevLog > **Status**: ✅ DONE → ⏳ VERIFIED 대기 (사용자 다음 SoM 호출에서 E2E 검증) > **시작**: 2026-05-14 19:00 KST (야놀자 분석 중 발견) > **완료**: 2026-05-14 21

## 핵심 요약


# 📋 T-FIX-SOM-RACE — DevLog

> **Status**: ✅ DONE → ⏳ VERIFIED 대기 (사용자 다음 SoM 호출에서 E2E 검증)
> **시작**: 2026-05-14 19:00 KST (야놀자 분석 중 발견)
> **완료**: 2026-05-14 21:10 KST
> **소요**: ~2시간 10분 (조사 30분 + G1 30분 + 구현 1시간 + 백필 10분)
> **관련 표준**: STD-SOM-FLOW v1.0 §2.1 SSOT 처방, T-PATCH-SOM-V10 후속

## 문제

Pipeline Orchestrator (`SXdgnGyUFMAP9oTB`) 노드 14 `📈 SoM Summary 집계` 가 v10 Main(`GPdC7tIQBraa0mae`) SubWF의 4개 LLM INSERT 완료 **이전**에 실행되는 race condition.

원인: `// v1.6: 대기 루프 제거 (AP-09 60초 제한 준수), 단일 조회로 변경` — AP-09 회피하려고 polling 제거 → executeWorkflow가 return되어도 4 LLM SubWF의 raw INSERT는 진행 중.

증거 (야놀자 해외 run_id 672):
- Summary 집계: 06:33:07.580 (raw 18/48만 들어와 있음)
- Perplexity own_brand_mentioned=true INSERT: 06:33:13 (+5.6s, 누락)
- Gemini own_brand_mentioned=true INSERT: 06:33:36 (+28.7s, 누락)
- 마지막 INSERT: 06:34:47 (+99.8s)

영향 (30일):
- 90 runs 중 72건(82.8%) race 영향
- 누락 rows 4,622 / 누락 mentioned 1,060
- 평균 데이터 손실률 57%

## 처방 (옵션 B — 별 Sub-WF + polling)

### 1. 신규 Sub-WF 생성: `🟢 [Phase2-Premium-3] SoM Summary Aggregator v1`

- WF ID: `jUrOYZhRwiwjouuM`
- 링크: https://bawee.app.n8n.cloud/workflow/jUrOYZhRwiwjouuM
- 노드 수: 16
- 골든 패턴 합치:
  - Pattern I-C (Config Loader Sub-WF) — `ioeCnRVbsFsohwv7` 호출
  - AP-08 (키 I패턴), AP-02 (Code fetch 금지 → HTTP Request), AP-09 회피
  - AP-16 (Switch/If 기존 구조 복사 — v10 Main의 Wait/Poll 패턴)
  - SKILL.md B2 (명시적 `_done` flag — Compute State Code 노드)
  - SKILL.md $input.all() 패턴 (HTTP Request 배열 응답 처리)
  - B5 `__rl:true` 플래그

### Polling 종료 조건 (3중 안전망)

| 조건 | 의미 |
|------|------|
| `count >= query_count × 4` | 정상 완료 (모든 LLM raw 도착) |
| 마지막 INSERT 후 5초 정체 | early exit (대기해도 더 안 옴) |
| 40 iter × 3s = 120s hard timeout | 비상 종료 + warning 명시 |

### 2. Pipeline Orchestrator 수정

- 노드 14 `📈 SoM Summary 집계` (Code, 5,381자 jsCode) → `🤖 Premium-3 SoM Aggregator` (executeWorkflow) 교체
- workflowId: `{value: "jUrOYZhRwiwjouuM", __rl: true}`, waitForSubWorkflow: true
- onError: continueErrorOutput (기존 패턴 유지)
- connections 그대로 보존:
  - Premium-2 SoM Benchmark → Premium-3
  - Premium-3.main[0] (성공) → Premium-4 Competitor
  - Premium-3.main[1] (에러) → 📢 Summary 실패 Alert (Telegram)
- 백업: `/home/claude/orchestrator_BEFORE_t-fix-som-race.json` (74,585 bytes)

### 3. 백필 (30일 race 영향 70 rows 일괄 갱신)

- 백업 테이블: `_backup_som_summary_race_fix_20260514` (90 rows)
- 갱신 컬럼: `total_responses`, `total_queries`, `overall_som`, `first_mention_rate`, `som_by_llm`
- 검증: 30일 90 runs 중 race 영향 0건 (백필 전 72건 → 0건)

## 데이터 영향 — 야놀자 케이스 사후 검증

### 국내 nol.yanolja.com (run_id 671)

| 지표 | 백필 전 | 백필 후 | 비고 |
|------|--------|--------|------|
| total_responses | 22 (race 19/48) | 48 | 100% 정확 |
| overall_som | 75.0% | **83.33%** | +8.3%p |
| OpenAI | 33.3% | **58.3%** | ⭐ 김태진 메일 수치 일치 |
| Gemini / Anthropic / Perplexity | 100% / 85.7% / 100% | 91.7% / 91.7% / 91.7% | 전수 정확 |

→ 김태진 주임 5/13 메일의 ChatGPT 58.3% 수치가 정답. 화면 표시(DB summary 75%)가 race로 잘못된 값이었고, 메일은 raw에서 직접 재집계한 정확한 값 사용.

### 해외 world.nol.com (run_id 672)

| 지표 | 백필 전 | 백필 후 |
|------|--------|--------|
| total_responses | 18 | 48 |
| overall_som | 0.00% | **4.17%** |
| Gemini | 0/4 = 0% | 1/12 = 8.3% |
| Perplexity | 0/3 = 0% | 1/12 = 8.3% |

→ 김태진 해외 보고서의 SoM 0%·언급률 4.3% 표기 정확.

## 검증 (AP-17)

### SYS-011

| 자산 | critical | warning | info | 신규 위반 |
|------|---------|---------|------|----------|
| Premium-3 Aggregator | 0 | 2 (N1/N7 시리즈 표준) | 2 (N2 false positive) | 0건 |
| Pipeline Orchestrator | 0 | 1 (N7 변경 전과 동일) | 1 (N6 변경 전과 동일) | 0건 |

### E2E

- 단독 webhook 테스트 (run_id 672 재집계): 응답 4.07초, 1 iter 종료, race 해결 입증 ✅
- 실 운영 E2E: 다음 사용자 SoM 호출에서 자동 검증 예정 (testbed 옵션 ② 채택)

## 부수 학습 (skill_creator 후보)

1. **Set 노드 expression의 `?.` optional chaining 한계** → Code 노드로 교체
2. **HTTP Request 배열 응답 분리 처리** → `$input.all()` 필수 (SKILL.md 강화 필요)
3. **If 노드 expression 한계** → 명시적 `_done` flag 패턴 (SKILL.md B2 확장 사례)
4. **Response 노드 민감 정보 노출 위험** → 화이트리스트 방식 권장 (AP-08 확장 — Response output까지 적용)
5. **executeWorkflow waitForSubWorkflow의 한계** — Sub-WF가 일찍 return하면 그 내부 비동기 INSERT는 대기 안 함 → polling 또는 SubWF 내부에서 동기화 필요

## 잔여 작업

- [x] Asana 태스크 1214629583828373 결과 댓글 등록
- [x] Premium-3 SoM Aggregator 생성·active
- [x] Pipeline Orchestrator 노드 14 교체
- [x] 30일 70 rows 백필
- [x] 본 DevLog 등록
- [ ] GEOCARE Snapshot (`061e5edb`) 갱신
- [ ] Cross-Room MB 발신 (장한솔 인지 트리거)
- [ ] STD-SOM-FLOW v1.0 갱신 (Issue 처방 적용 표기)
- [ ] AP 카탈로그 v2.21 학습 사항 5건 추가 검토

## 백업 자산 위치

- Pipeline 변경 전 풀 JSON: `/home/claude/orchestrator_BEFORE_t-fix-som-race.json`
- 노드 14 jsCode 백업: `/home/claude/node14_BEFORE_code.txt`
- som_summary 30일 백업: `_backup_som_summary_race_fix_20260514` 테이블
- 신규 Sub-WF 페이로드: `/home/claude/agg_v4_patched.json`

## 5분 롤백 절차

1. Premium-3 Sub-WF 비활성: `PATCH /workflows/jUrOYZhRwiwjouuM {"active": false}`
2. Pipeline 노드 14 복원: `PUT` with `/home/claude/orchestrator_BEFORE_t-fix-som-race.json`
3. som_summary 롤백: `UPDATE gp_geoex_som_summary su SET ... FROM _backup_som_summary_race_fix_20260514 b WHERE su.id = b.id;`

## 관련 자산

- Pipeline Orchestrator: https://bawee.app.n8n.cloud/workflow/SXdgnGyUFMAP9oTB
- Premium-3 Aggregator: https://bawee.app.n8n.cloud/workflow/jUrOYZhRwiwjouuM
- v10 Main: https://bawee.app.n8n.cloud/workflow/GPdC7tIQBraa0mae
- Asana 야놀자 태스크: https://app.asana.com/0/0/1214629583828373
- STD-SOM-FLOW v1.0: `83f428e7-ebab-480f-858f-9c05c62a53ba`

## FAQ


---
출처: https://bizspring.ai/kb/ref/khub/geocare-t-fix-som-race-devlog-v1-0 · 최종 갱신 2026-08-24T11:53:44.5731+00:00
