{
  "id": "aa9818fa-6057-4e51-b8e5-aaba90b9e604",
  "slug": "ref/khub/geocare-t-fix-som-race-devlog-v1-0",
  "doc_type": "ref",
  "title": "📋 T-FIX-SOM-RACE — DevLog v1.0",
  "title_en": null,
  "one_liner": "# 📋 T-FIX-SOM-RACE — DevLog > **Status**: ✅ DONE → ⏳ VERIFIED 대기 (사용자 다음 SoM 호출에서 E2E 검증) > **시작**: 2026-05-14 19:00 KST (야놀자 분석 중 발견) > **완료**: 2026-05-14 21",
  "summary_bullets": [],
  "body_md": "# 📋 T-FIX-SOM-RACE — DevLog\n\n> **Status**: ✅ DONE → ⏳ VERIFIED 대기 (사용자 다음 SoM 호출에서 E2E 검증)\n> **시작**: 2026-05-14 19:00 KST (야놀자 분석 중 발견)\n> **완료**: 2026-05-14 21:10 KST\n> **소요**: ~2시간 10분 (조사 30분 + G1 30분 + 구현 1시간 + 백필 10분)\n> **관련 표준**: STD-SOM-FLOW v1.0 §2.1 SSOT 처방, T-PATCH-SOM-V10 후속\n\n## 문제\n\nPipeline Orchestrator (`SXdgnGyUFMAP9oTB`) 노드 14 `📈 SoM Summary 집계` 가 v10 Main(`GPdC7tIQBraa0mae`) SubWF의 4개 LLM INSERT 완료 **이전**에 실행되는 race condition.\n\n원인: `// v1.6: 대기 루프 제거 (AP-09 60초 제한 준수), 단일 조회로 변경` — AP-09 회피하려고 polling 제거 → executeWorkflow가 return되어도 4 LLM SubWF의 raw INSERT는 진행 중.\n\n증거 (야놀자 해외 run_id 672):\n- Summary 집계: 06:33:07.580 (raw 18/48만 들어와 있음)\n- Perplexity own_brand_mentioned=true INSERT: 06:33:13 (+5.6s, 누락)\n- Gemini own_brand_mentioned=true INSERT: 06:33:36 (+28.7s, 누락)\n- 마지막 INSERT: 06:34:47 (+99.8s)\n\n영향 (30일):\n- 90 runs 중 72건(82.8%) race 영향\n- 누락 rows 4,622 / 누락 mentioned 1,060\n- 평균 데이터 손실률 57%\n\n## 처방 (옵션 B — 별 Sub-WF + polling)\n\n### 1. 신규 Sub-WF 생성: `🟢 [Phase2-Premium-3] SoM Summary Aggregator v1`\n\n- WF ID: `jUrOYZhRwiwjouuM`\n- 링크: https://bawee.app.n8n.cloud/workflow/jUrOYZhRwiwjouuM\n- 노드 수: 16\n- 골든 패턴 합치:\n  - Pattern I-C (Config Loader Sub-WF) — `ioeCnRVbsFsohwv7` 호출\n  - AP-08 (키 I패턴), AP-02 (Code fetch 금지 → HTTP Request), AP-09 회피\n  - AP-16 (Switch/If 기존 구조 복사 — v10 Main의 Wait/Poll 패턴)\n  - SKILL.md B2 (명시적 `_done` flag — Compute State Code 노드)\n  - SKILL.md $input.all() 패턴 (HTTP Request 배열 응답 처리)\n  - B5 `__rl:true` 플래그\n\n### Polling 종료 조건 (3중 안전망)\n\n| 조건 | 의미 |\n|------|------|\n| `count >= query_count × 4` | 정상 완료 (모든 LLM raw 도착) |\n| 마지막 INSERT 후 5초 정체 | early exit (대기해도 더 안 옴) |\n| 40 iter × 3s = 120s hard timeout | 비상 종료 + warning 명시 |\n\n### 2. Pipeline Orchestrator 수정\n\n- 노드 14 `📈 SoM Summary 집계` (Code, 5,381자 jsCode) → `🤖 Premium-3 SoM Aggregator` (executeWorkflow) 교체\n- workflowId: `{value: \"jUrOYZhRwiwjouuM\", __rl: true}`, waitForSubWorkflow: true\n- onError: continueErrorOutput (기존 패턴 유지)\n- connections 그대로 보존:\n  - Premium-2 SoM Benchmark → Premium-3\n  - Premium-3.main[0] (성공) → Premium-4 Competitor\n  - Premium-3.main[1] (에러) → 📢 Summary 실패 Alert (Telegram)\n- 백업: `/home/claude/orchestrator_BEFORE_t-fix-som-race.json` (74,585 bytes)\n\n### 3. 백필 (30일 race 영향 70 rows 일괄 갱신)\n\n- 백업 테이블: `_backup_som_summary_race_fix_20260514` (90 rows)\n- 갱신 컬럼: `total_responses`, `total_queries`, `overall_som`, `first_mention_rate`, `som_by_llm`\n- 검증: 30일 90 runs 중 race 영향 0건 (백필 전 72건 → 0건)\n\n## 데이터 영향 — 야놀자 케이스 사후 검증\n\n### 국내 nol.yanolja.com (run_id 671)\n\n| 지표 | 백필 전 | 백필 후 | 비고 |\n|------|--------|--------|------|\n| total_responses | 22 (race 19/48) | 48 | 100% 정확 |\n| overall_som | 75.0% | **83.33%** | +8.3%p |\n| OpenAI | 33.3% | **58.3%** | ⭐ 김태진 메일 수치 일치 |\n| Gemini / Anthropic / Perplexity | 100% / 85.7% / 100% | 91.7% / 91.7% / 91.7% | 전수 정확 |\n\n→ 김태진 주임 5/13 메일의 ChatGPT 58.3% 수치가 정답. 화면 표시(DB summary 75%)가 race로 잘못된 값이었고, 메일은 raw에서 직접 재집계한 정확한 값 사용.\n\n### 해외 world.nol.com (run_id 672)\n\n| 지표 | 백필 전 | 백필 후 |\n|------|--------|--------|\n| total_responses | 18 | 48 |\n| overall_som | 0.00% | **4.17%** |\n| Gemini | 0/4 = 0% | 1/12 = 8.3% |\n| Perplexity | 0/3 = 0% | 1/12 = 8.3% |\n\n→ 김태진 해외 보고서의 SoM 0%·언급률 4.3% 표기 정확.\n\n## 검증 (AP-17)\n\n### SYS-011\n\n| 자산 | critical | warning | info | 신규 위반 |\n|------|---------|---------|------|----------|\n| Premium-3 Aggregator | 0 | 2 (N1/N7 시리즈 표준) | 2 (N2 false positive) | 0건 |\n| Pipeline Orchestrator | 0 | 1 (N7 변경 전과 동일) | 1 (N6 변경 전과 동일) | 0건 |\n\n### E2E\n\n- 단독 webhook 테스트 (run_id 672 재집계): 응답 4.07초, 1 iter 종료, race 해결 입증 ✅\n- 실 운영 E2E: 다음 사용자 SoM 호출에서 자동 검증 예정 (testbed 옵션 ② 채택)\n\n## 부수 학습 (skill_creator 후보)\n\n1. **Set 노드 expression의 `?.` optional chaining 한계** → Code 노드로 교체\n2. **HTTP Request 배열 응답 분리 처리** → `$input.all()` 필수 (SKILL.md 강화 필요)\n3. **If 노드 expression 한계** → 명시적 `_done` flag 패턴 (SKILL.md B2 확장 사례)\n4. **Response 노드 민감 정보 노출 위험** → 화이트리스트 방식 권장 (AP-08 확장 — Response output까지 적용)\n5. **executeWorkflow waitForSubWorkflow의 한계** — Sub-WF가 일찍 return하면 그 내부 비동기 INSERT는 대기 안 함 → polling 또는 SubWF 내부에서 동기화 필요\n\n## 잔여 작업\n\n- [x] Asana 태스크 1214629583828373 결과 댓글 등록\n- [x] Premium-3 SoM Aggregator 생성·active\n- [x] Pipeline Orchestrator 노드 14 교체\n- [x] 30일 70 rows 백필\n- [x] 본 DevLog 등록\n- [ ] GEOCARE Snapshot (`061e5edb`) 갱신\n- [ ] Cross-Room MB 발신 (장한솔 인지 트리거)\n- [ ] STD-SOM-FLOW v1.0 갱신 (Issue 처방 적용 표기)\n- [ ] AP 카탈로그 v2.21 학습 사항 5건 추가 검토\n\n## 백업 자산 위치\n\n- Pipeline 변경 전 풀 JSON: `/home/claude/orchestrator_BEFORE_t-fix-som-race.json`\n- 노드 14 jsCode 백업: `/home/claude/node14_BEFORE_code.txt`\n- som_summary 30일 백업: `_backup_som_summary_race_fix_20260514` 테이블\n- 신규 Sub-WF 페이로드: `/home/claude/agg_v4_patched.json`\n\n## 5분 롤백 절차\n\n1. Premium-3 Sub-WF 비활성: `PATCH /workflows/jUrOYZhRwiwjouuM {\"active\": false}`\n2. Pipeline 노드 14 복원: `PUT` with `/home/claude/orchestrator_BEFORE_t-fix-som-race.json`\n3. som_summary 롤백: `UPDATE gp_geoex_som_summary su SET ... FROM _backup_som_summary_race_fix_20260514 b WHERE su.id = b.id;`\n\n## 관련 자산\n\n- Pipeline Orchestrator: https://bawee.app.n8n.cloud/workflow/SXdgnGyUFMAP9oTB\n- Premium-3 Aggregator: https://bawee.app.n8n.cloud/workflow/jUrOYZhRwiwjouuM\n- v10 Main: https://bawee.app.n8n.cloud/workflow/GPdC7tIQBraa0mae\n- Asana 야놀자 태스크: https://app.asana.com/0/0/1214629583828373\n- STD-SOM-FLOW v1.0: `83f428e7-ebab-480f-858f-9c05c62a53ba`",
  "related_slugs": [],
  "faq": [],
  "jsonld": null,
  "keywords": [],
  "source_id": "922c58b3-3a4e-4e96-8fdd-b2df55eb782a",
  "video_url": null,
  "duration_sec": null,
  "thumbnail_url": null,
  "image_url": null,
  "caption": null,
  "solution_slug": null,
  "captured_at": null,
  "width": null,
  "height": null,
  "created_at": "2026-08-24T11:53:44.5731+00:00",
  "updated_at": "2026-08-24T11:53:44.5731+00:00",
  "visibility": "public",
  "source_stage": "1",
  "anonymized": true,
  "source_key": "legacy-khub",
  "origin": "ingest",
  "locked": false,
  "locked_by": null,
  "locked_at": null,
  "gate_state": {
    "g1": {
      "hits": [],
      "pass": true
    },
    "g2": {
      "pass": true,
      "total": 62,
      "issues": [
        "핵심 요약 불릿이 3개 미만입니다",
        "Q&A 쌍이 3개 미만입니다"
      ],
      "applies": true
    },
    "g3": {
      "pass": true,
      "required": false
    },
    "stage": "1",
    "decided_at": "2026-08-24T11:53:44.334Z"
  },
  "raw_id": "fff5145d-83be-479d-b9c4-0b4d9c22b2e2",
  "search_text": "📋 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\n\n> **Status**: ✅ DONE → ⏳ VERIFIED 대기 (사용자 다음 SoM 호출에서 E2E 검증)\n> **시작**: 2026-05-14 19:00 KST (야놀자 분석 중 발견)\n> **완료**: 2026-05-14 21:10 KST\n> **소요**: ~2시간 10분 (조사 30분 + G1 30분 + 구현 1시간 + 백필 10분)\n> **관련 표준**: STD-SOM-FLOW v1.0 §2.1 SSOT 처방, T-PATCH-SOM-V10 후속\n\n## 문제\n\nPipeline Orchestrator (`SXdgnGyUFMAP9oTB`) 노드 14 `📈 SoM Summary 집계` 가 v10 Main(`GPdC7tIQBraa0mae`) SubWF의 4개 LLM INSERT 완료 **이전**에 실행되는 race condition.\n\n원인: `// v1.6: 대기 루프 제거 (AP-09 60초 제한 준수), 단일 조회로 변경` — AP-09 회피하려고 polling 제거 → executeWorkflow가 return되어도 4 LLM SubWF의 raw INSERT는 진행 중.\n\n증거 (야놀자 해외 run_id 672):\n- Summary 집계: 06:33:07.580 (raw 18/48만 들어와 있음)\n- Perplexity own_brand_mentioned=true INSERT: 06:33:13 (+5.6s, 누락)\n- Gemini own_brand_mentioned=true INSERT: 06:33:36 (+28.7s, 누락)\n- 마지막 INSERT: 06:34:47 (+99.8s)\n\n영향 (30일):\n- 90 runs 중 72건(82.8%) race 영향\n- 누락 rows 4,622 / 누락 mentioned 1,060\n- 평균 데이터 손실률 57%\n\n## 처방 (옵션 B — 별 Sub-WF + polling)\n\n### 1. 신규 Sub-WF 생성: `🟢 [Phase2-Premium-3] SoM Summary Aggregator v1`\n\n- WF ID: `jUrOYZhRwiwjouuM`\n- 링크: https://bawee.app.n8n.cloud/workflow/jUrOYZhRwiwjouuM\n- 노드 수: 16\n- 골든 패턴 합치:\n  - Pattern I-C (Config Loader Sub-WF) — `ioeCnRVbsFsohwv7` 호출\n  - AP-08 (키 I패턴), AP-02 (Code fetch 금지 → HTTP Request), AP-09 회피\n  - AP-16 (Switch/If 기존 구조 복사 — v10 Main의 Wait/Poll 패턴)\n  - SKILL.md B2 (명시적 `_done` flag — Compute State Code 노드)\n  - SKILL.md $input.all() 패턴 (HTTP Request 배열 응답 처리)\n  - B5 `__rl:true` 플래그\n\n### Polling 종료 조건 (3중 안전망)\n\n| 조건 | 의미 |\n|------|------|\n| `count >= query_count × 4` | 정상 완료 (모든 LLM raw 도착) |\n| 마지막 INSERT 후 5초 정체 | early exit (대기해도 더 안 옴) |\n| 40 iter × 3s = 120s hard timeout | 비상 종료 + warning 명시 |\n\n### 2. Pipeline Orchestrator 수정\n\n- 노드 14 `📈 SoM Summary 집계` (Code, 5,381자 jsCode) → `🤖 Premium-3 SoM Aggregator` (executeWorkflow) 교체\n- workflowId: `{value: \"jUrOYZhRwiwjouuM\", __rl: true}`, waitForSubWorkflow: true\n- onError: continueErrorOutput (기존 패턴 유지)\n- connections 그대로 보존:\n  - Premium-2 SoM Benchmark → Premium-3\n  - Premium-3.main[0] (성공) → Premium-4 Competitor\n  - Premium-3.main[1] (에러) → 📢 Summary 실패 Alert (Telegram)\n- 백업: `/home/claude/orchestrator_BEFORE_t-fix-som-race.json` (74,585 bytes)\n\n### 3. 백필 (30일 race 영향 70 rows 일괄 갱신)\n\n- 백업 테이블: `_backup_som_summary_race_fix_20260514` (90 rows)\n- 갱신 컬럼: `total_responses`, `total_queries`, `overall_som`, `first_mention_rate`, `som_by_llm`\n- 검증: 30일 90 runs 중 race 영향 0건 (백필 전 72건 → 0건)\n\n## 데이터 영향 — 야놀자 케이스 사후 검증\n\n### 국내 nol.yanolja.com (run_id 671)\n\n| 지표 | 백필 전 | 백필 후 | 비고 |\n|------|--------|--------|------|\n| total_responses | 22 (race 19/48) | 48 | 100% 정확 |\n| overall_som | 75.0% | **83.33%** | +8.3%p |\n| OpenAI | 33.3% | **58.3%** | ⭐ 김태진 메일 수치 일치 |\n| Gemini / Anthropic / Perplexity | 100% / 85.7% / 100% | 91.7% / 91.7% / 91.7% | 전수 정확 |\n\n→ 김태진 주임 5/13 메일의 ChatGPT 58.3% 수치가 정답. 화면 표시(DB summary 75%)가 race로 잘못된 값이었고, 메일은 raw에서 직접 재집계한 정확한 값 사용.\n\n### 해외 world.nol.com (run_id 672)\n\n| 지표 | 백필 전 | 백필 후 |\n|------|--------|--------|\n| total_responses | 18 | 48 |\n| overall_som | 0.00% | **4.17%** |\n| Gemini | 0/4 = 0% | 1/12 = 8.3% |\n| Perplexity | 0/3 = 0% | 1/12 = 8.3% |\n\n→ 김태진 해외 보고서의 SoM 0%·언급률 4.3% 표기 정확.\n\n## 검증 (AP-17)\n\n### SYS-011\n\n| 자산 | critical | warning | info | 신규 위반 |\n|------|---------|---------|------|----------|\n| Premium-3 Aggregator | 0 | 2 (N1/N7 시리즈 표준) | 2 (N2 false positive) | 0건 |\n| Pipeline Orchestrator | 0 | 1 (N7 변경 전과 동일) | 1 (N6 변경 전과 동일) | 0건 |\n\n### E2E\n\n- 단독 webhook 테스트 (run_id 672 재집계): 응답 4.07초, 1 iter 종료, race 해결 입증 ✅\n- 실 운영 E2E: 다음 사용자 SoM 호출에서 자동 검증 예정 (testbed 옵션 ② 채택)\n\n## 부수 학습 (skill_creator 후보)\n\n1. **Set 노드 expression의 `?.` optional chaining 한계** → Code 노드로 교체\n2. **HTTP Request 배열 응답 분리 처리** → `$input.all()` 필수 (SKILL.md 강화 필요)\n3. **If 노드 expression 한계** → 명시적 `_done` flag 패턴 (SKILL.md B2 확장 사례)\n4. **Response 노드 민감 정보 노출 위험** → 화이트리스트 방식 권장 (AP-08 확장 — Response output까지 적용)\n5. **executeWorkflow waitForSubWorkflow의 한계** — Sub-WF가 일찍 return하면 그 내부 비동기 INSERT는 대기 안 함 → polling 또는 SubWF 내부에서 동기화 필요\n\n## 잔여 작업\n\n- [x] Asana 태스크 1214629583828373 결과 댓글 등록\n- [x] Premium-3 SoM Aggregator 생성·active\n- [x] Pipeline Orchestrator 노드 14 교체\n- [x] 30일 70 rows 백필\n- [x] 본 DevLog 등록\n- [ ] GEOCARE Snapshot (`061e5edb`) 갱신\n- [ ] Cross-Room MB 발신 (장한솔 인지 트리거)\n- [ ] STD-SOM-FLOW v1.0 갱신 (Issue 처방 적용 표기)\n- [ ] AP 카탈로그 v2.21 학습 사항 5건 추가 검토\n\n## 백업 자산 위치\n\n- Pipeline 변경 전 풀 JSON: `/home/claude/orchestrator_BEFORE_t-fix-som-race.json`\n- 노드 14 jsCode 백업: `/home/claude/node14_BEFORE_code.txt`\n- som_summary 30일 백업: `_backup_som_summary_race_fix_20260514` 테이블\n- 신규 Sub-WF 페이로드: `/home/claude/agg_v4_patched.json`\n\n## 5분 롤백 절차\n\n1. Premium-3 Sub-WF 비활성: `PATCH /workflows/jUrOYZhRwiwjouuM {\"active\": false}`\n2. Pipeline 노드 14 복원: `PUT` with `/home/claude/orchestrator_BEFORE_t-fix-som-race.json`\n3. som_summary 롤백: `UPDATE gp_geoex_som_summary su SET ... FROM _backup_som_summary_race_fix_20260514 b WHERE su.id = b.id;`\n\n## 관련 자산\n\n- Pipeline Orchestrator: https://bawee.app.n8n.cloud/workflow/SXdgnGyUFMAP9oTB\n- Premium-3 Aggregator: https://bawee.app.n8n.cloud/workflow/jUrOYZhRwiwjouuM\n- v10 Main: https://bawee.app.n8n.cloud/workflow/GPdC7tIQBraa0mae\n- Asana 야놀자 태스크: https://app.asana.com/0/0/1214629583828373\n- STD-SOM-FLOW v1.0: `83f428e7-ebab-480f-858f-9c05c62a53ba`",
  "embedding": null,
  "embedded_at": null,
  "embedding_hash": null,
  "backlinks": [],
  "html_url": "https://bizspring.ai/kb/ref/khub/geocare-t-fix-som-race-devlog-v1-0",
  "markdown_url": "https://bizspring.ai/kb/ref/khub/geocare-t-fix-som-race-devlog-v1-0.md"
}