042cb2d1-4f46-44f1-95a2-e0fb73002888_15B5-REENTRY재입장 루프1회 / 임계 1아동 화면이 반복 재입장에 갇힌다.
GUEST_ENTRY|Re-entry loop detectedD4-UPLINK소켓 업링크 정체(ack timeout)1회 / 임계 1아동 이벤트가 서버에 늦게 도달해 반응이 밀린다.
SOCKET_UPLINK|Uplink stall detected (ack timeout)마지막 업데이트 2026-08-25
동일한 원본 로그, 동일한 제외 기준(테스트 계정·force kick). 판정 축만 바꿨다.
| 축 | 기존 포맷 | 개선 포맷 |
|---|---|---|
| 선별 기준 | error/치명 로그가 있으면 후보 | 사용자 영향이 정의된 룰이 임계를 넘으면 후보 |
| 심각도 | 긴급 / 확인 (로그 레벨 개수) | 차단 / 저하 / 관측 (수업 진행에 미치는 영향) |
| 카드 본문 | 37건 중 26건이 error 레벨; error 레벨 | 룰마다 영향 문장 1줄 고정 |
| 근거 | 동시 발생 시그니처 상위 3개(무관한 것 포함) | 룰이 매칭한 로그만 시각과 함께 |
| 분류 | 같은 시그니처가 세션마다 다른 그룹 | 룰 ID가 곧 분류 (1:1) |
| 노이즈 | 임계 없음 (1회도 후보) | 기저 발생률 측정 후 관측으로 격리 |
| 미확정 | 표기 없음 | 룰 단위로 "미확정" 사유 명시 |
기존 포맷의 긴급 1·2·4·7위. 근거는 "통보는 됐으나 goToNextStep이 호출되지 않았다".
당일 전체 로그에서 Video ended — transition snapshot과 goToNextStep called를 (activityIndex, stepIndex)로 짝지으면
autoTransitionEnabled=true인 통보 1615건은 1615건 모두 60초 내에 goToNextStep이 뒤따랐다.
짝이 없는 통보는 5건뿐이고, 그 5건은 전부 autoTransitionEnabled=false — 진행자가 자동전환을 꺼둔 상태였다.
// 김재겸 4회기 — 기존 포맷이 "자동전환 실패 2건 (긴급)"으로 올린 세션 15:01:16 transition snapshot act0/step0 autoTransitionEnabled=true 15:01:16 goToNextStep called act0/step0 ← 같은 초에 정상 전환 ... (act0/1, act0/2, act1/0, act2/0, act3/0 모두 동일 패턴, 누락 0) 15:20:28 transition snapshot act7/step0 autoTransitionEnabled=false ← 자동전환 OFF 15:21:37 transition snapshot act7/step1 autoTransitionEnabled=false ← 자동전환 OFF → 이 2건을 "실패"로 집계
// 오탐이 만들어진 경로 autoTransitionEnabled 플래그 미검사 → 진행자가 끈 전환까지 "통보 후 미호출"로 집계 → 무관한 동시 발생 시그니처(RESOURCE_ERROR, MFCC 업로드 실패)를 근거로 첨부 → error 로그 1건 동반 → 긴급 승격 → 긴급 8건 중 4건(50%)이 오탐, 운영자 확인 시간 낭비
나머지 탈락 2건도 같은 계열이다. 김재겸 4회기(긴급), 정이안 13회기(확인), 차예준 8회기(긴급), 허윤서 39회기(확인) — 정이안은 캐시 실패였으나 원본은 정상 제공됐고,
허윤서는 Ack received for unexpected RPC request만으로 등재됐다. 이 RPC 경합 로그는 당일 11개 세션에서 나오며 증상과 연결된 근거가 없다.
기존 포맷은 세션을 독립 카드로만 나열해, 여러 아동에게 동시에 일어난 사건을 개별 이슈로 흩뿌린다.
// AI 세션 시작 실패 + 에이전트 준비 타임아웃 — 발생 시각 17:51:59 김나은 46회기 Failed to start session (UNAUTHORIZED 동반, 단독 사건) 20:14:49 김시은 45회기 Failed to start session + agent readiness wait failed 20:14:49 김민하 10회기 Failed to start session + agent readiness wait failed ← 초 단위 동시 20:49:27 김리현 16회기 Failed to start session + agent readiness wait failed
20:14:49의 두 건은 서로 다른 아동·진행자·기기인데 같은 초에 같은 실패를 냈다. 개별 아동 문제가 아니라 LiveKit 에이전트 측 사건으로 봐야 하고, 확인 대상도 아동 세션이 아니라 그 시각의 agent 로그다. 기존 포맷에서는 3위·6위 카드로 떨어져 있어 이 관계가 드러나지 않았다.
warn으로만 남는 계열이다 —
영상 첫 재생 시 출력 무음(25), 로컬 트랙 muted/ended(22), 영상 리버퍼링 상위 5%(11), 업링크 정체(9).
기존 포맷은 error 레벨만 후보로 올려 이들을 구조적으로 제외했다.1회 발생을 알림으로 올리기 전에 당일 전체 세션의 기저 발생률을 먼저 잰다.
| 시그니처 | 발생 세션 | 총 건수 | 판정 | 근거 |
|---|---|---|---|---|
MONITOR_CONSUMER|Consumer suspected silent | 111 / 233 | 754 | 관측 | 754건 전부 trigger=consumer-created. 코드상 이 프로브는 consumer 생성 직후 2회 샘플링이 유일한 호출 지점이라, 아동이 마침 말하지 않으면 정상 세션에서도 뜬다. 지속 무음의 근거가 못 된다. |
MEET_VIDEO|Unexpected pause detected | 121 / 233 | 2649 | 관측 | 52% 기저 발생, 자동 복구 경로 포함 |
CONSOLE|Ack/Response for unexpected RPC | 11 / 233 | 360 | 관측 | error 레벨이지만 증상 연결 근거 없음 |
MEET_VIDEO|Video waiting [*] | 134 / 233 | — | 저하(임계 12) | p50=2, p90=10, p95=11 → 12회 이상만 알림(11세션) |
Consumer suspected silent 23회로 "확인" 등재됐는데,
이는 23번의 무음 구간이 아니라 consumer가 23번 재생성된 것이다. 반대로 이 시그니처가 111개 세션에서 나온다는 사실은 카드 어디에도 없었다.룰 ID = 분류. 임계와 영향 문장을 룰에 붙여두면 카드 본문이 비지 않는다.
| ID | 등급 | 이름 | 매칭 시그니처 | 임계 | 사용자 영향 / 비고 | 세션 |
|---|---|---|---|---|---|---|
B1-AI-START | 차단 | AI 세션 시작 실패 | AI_SESSION|Failed to start session | ≥1회 | 핑퐁이와 대화 자체가 시작되지 않는다 | 4 |
B2-AGENT-READY | 차단 | LiveKit 에이전트 준비 타임아웃 | LiveKit agent readiness wait failed / LiveKitAgentReadinessTimeoutError | ≥1회 | 에이전트가 방에 붙지 않아 AI 무응답 | 3 |
B3-ENTRY | 차단 | 수업 데이터 로드 실패로 입장 차단 | GUEST_PAGE_SESSION|Failed to load lesson data, blocking entry | ≥1회 | 아동이 수업에 들어가지 못함 | 1 |
B4-MIC | 차단 | 마이크 권한 거부 | LOCAL_MEDIA_STREAM|getUserMedia failed (NotAllowedError) | ≥1회 | 아동 음성이 캡처되지 않음 | 2 |
B5-REENTRY | 차단 | 재입장 루프 | GUEST_ENTRY|Re-entry loop detected | ≥1회 | 아동 화면이 재입장에 갇힘 | 3 |
B6-AUTOTRANS | 차단 | 영상 종료 자동전환 끊김 | autoTransitionEnabled=true 스냅샷 후 60초 내 동일 (activity,step) goToNextStep 없음 | ≥1회 | 진행자 수동 전환 필요 | 0 |
D1-INPUT-SYNC | 저하 | 듣기 ON/OFF가 에이전트에 미반영 | Failed to update LiveKit runtime input enabled | ≥1회 | 듣기를 켜도 AI가 아동 발화를 못 받는 구간 발생 | 9 |
D2-NO-RESP | 저하 | OpenAI 응답 5초 초과 | AI_SESSION|No response from OpenAI within N seconds | ≥2회 | 아동 발화 뒤 핑퐁이 침묵 | 6 |
D3-INTERRUPT | 저하 | AI 발화 중단(끼어들기) 실패 | Failed to send LiveKit manual interrupt | ≥1회 | 아동이 말해도 발화가 안 멈춤 | 3 |
D4-UPLINK | 저하 | 소켓 업링크 정체 | SOCKET_UPLINK|Uplink stall detected (ack timeout) | ≥1회 | 아동 이벤트 서버 도달 지연 | 9 |
D5-CONSUME | 저하 | 미디어 consume/resume 실패 | Consume failed / Failed to resume consumer / set consumer layer | ≥1회 | 모니터에 아동·AI 미디어가 안 붙음 | 8 |
D6-TRANSPORT | 저하 | mediasoup 트랜스포트 실패 | Send transport failed / Mediasoup transport failed | ≥1회 | 미디어 경로 단절·재연결 | 3 |
D7-AI-AUDIO-STALL | 저하 | AI 오디오 producer 송신 정지 | MEDIASOUP_PRODUCER|Audio producer outbound stalled | ≥1회 | 진행자 쪽 핑퐁이 소리 끊김 | 4 |
D8-OUTPUT-SILENT | 저하 | 영상 첫 재생 시 출력 무음 | AUDIO_PROBE|Audio output suspected silent (trigger≠warmup) | ≥1회 | 아동 기기에서 소리 없이 수업 시작 | 25 |
D9-VIDEO-REBUF | 저하 | 영상 리버퍼링·디코드 과부하 | MEET_VIDEO|Video waiting [*] | ≥12회 (당일 p95=11) | 영상 끊김·멈춤 | 11 |
D10-TRACK-LOST | 저하 | 로컬 미디어 트랙 muted/ended | LOCAL_MEDIA_STREAM|Local media track muted/ended | ≥1회 (당일 p95=1) | 아동 카메라·마이크 트랙 중도 소실 | 22 |
D11-MIC-RACE | 저하·미확정 | 활동 전환 중 mic producer 초기화 경합 | MEDIASOUP_PRODUCER|Failed to produce mic audio (queue stopped) | ≥1회 | 모니터 relay 마이크 미연결 가능. 후속 성공 로그 없어 미확정 | 12 |
O1-SILENT-PROBE | 관측 | 생성 직후 consumer 무음 프로브 | MONITOR_CONSUMER|Consumer suspected silent | 알림 제외 | 754건 전부 trigger=consumer-created. 111/233 세션(48%) 기저 발생 | 111 |
O2-RPC | 관측 | LiveKit RPC ack/response 경합 | Ack/Response received for unexpected RPC request | 알림 제외 | 증상과 연결된 근거 없음 | 11 |
O3-RESCACHE | 관측 | 리소스 캐시 실패(원본 제공됨) | RESOURCE_CACHE|... but resource is available | 알림 제외 | 캐시만 실패, 재생은 정상 | 1 |
O4-PAUSE-RECOVER | 관측 | 영상 일시정지 자동복구 | MEET_VIDEO|Unexpected pause detected, attempting recovery | 알림 제외 | 121/233 세션(52%) 기저 발생, 자동 복구됨 | 121 |
autoTransitionEnabled 조건이 빠진 형태였다.카드마다: 영향 문장 · 룰 ID와 임계 · 매칭 로그 시각 · roomId. 기존 포맷에서 어떻게 분류됐는지도 함께 표기했다.
042cb2d1-4f46-44f1-95a2-e0fb73002888_15B5-REENTRY재입장 루프1회 / 임계 1아동 화면이 반복 재입장에 갇힌다.
GUEST_ENTRY|Re-entry loop detectedD4-UPLINK소켓 업링크 정체(ack timeout)1회 / 임계 1아동 이벤트가 서버에 늦게 도달해 반응이 밀린다.
SOCKET_UPLINK|Uplink stall detected (ack timeout)963a5f2c-94d8-48b1-a22b-d3ee4abd8854_2B4-MIC마이크 권한 거부(getUserMedia NotAllowedError)1회 / 임계 1아동 음성이 아예 캡처되지 않아 AI·진행자 모두 못 듣는다.
LOCAL_MEDIA_STREAM|getUserMedia failedb9faeb69-7c01-4c8b-ae84-464a6ea65e66_46B1-AI-STARTAI 세션 시작 실패2회 / 임계 1핑퐁이와 대화를 시작하지 못해 수업 진행 자체가 막힌다.
AI_SESSION|Failed to start sessionAI_SESSION|Failed to start session (handler)59b42ded-c7bf-45ec-9978-c46260865518_48B4-MIC마이크 권한 거부(getUserMedia NotAllowedError)1회 / 임계 1아동 음성이 아예 캡처되지 않아 AI·진행자 모두 못 듣는다.
LOCAL_MEDIA_STREAM|getUserMedia failedD1-INPUT-SYNC듣기 ON/OFF 상태가 에이전트에 반영 실패2회 / 임계 1진행자가 듣기를 켜도 AI가 아동 발화를 받지 못하는 구간이 생긴다.
LIVEKIT_CLIENT_SESSION|Failed to update LiveKit runtime input enabledLIVEKIT_CLIENT_SESSION|Failed to update LiveKit runtime input enabled420ecf3d-0605-4e0b-9c51-f82c8a7a93a1_13B3-ENTRY수업 데이터 로드 실패로 입장 차단1회 / 임계 1아동이 수업에 들어가지 못한다.
GUEST_PAGE_SESSION|Failed to load lesson data, blocking entry160c31ba-1cbc-4c71-950a-e809c99aa86c_45B1-AI-STARTAI 세션 시작 실패2회 / 임계 1핑퐁이와 대화를 시작하지 못해 수업 진행 자체가 막힌다.
AI_SESSION|Failed to start sessionAI_SESSION|Failed to start session (handler)B2-AGENT-READYLiveKit 에이전트 준비 타임아웃2회 / 임계 1에이전트가 방에 붙지 않아 AI가 응답할 수 없다.
LIVEKIT_CLIENT_SESSION|LiveKit agent readiness wait failedUNHANDLED_REJECTION|LiveKitAgentReadinessTimeoutError: LiveKit agent readiness timed outD1-INPUT-SYNC듣기 ON/OFF 상태가 에이전트에 반영 실패1회 / 임계 1진행자가 듣기를 켜도 AI가 아동 발화를 받지 못하는 구간이 생긴다.
LIVEKIT_CLIENT_SESSION|Failed to update LiveKit runtime input enabledD8-OUTPUT-SILENT영상 첫 재생 시 출력 무음 감지1회 / 임계 1아동 기기에서 소리가 안 나는 상태로 수업이 시작된다.
AUDIO_PROBE|Audio output suspected silente22f550e-0658-4c72-ad8f-acd962f13ca8_10B1-AI-STARTAI 세션 시작 실패2회 / 임계 1핑퐁이와 대화를 시작하지 못해 수업 진행 자체가 막힌다.
AI_SESSION|Failed to start sessionAI_SESSION|Failed to start session (handler)B2-AGENT-READYLiveKit 에이전트 준비 타임아웃2회 / 임계 1에이전트가 방에 붙지 않아 AI가 응답할 수 없다.
LIVEKIT_CLIENT_SESSION|LiveKit agent readiness wait failedUNHANDLED_REJECTION|LiveKitAgentReadinessTimeoutError: LiveKit agent readiness timed outD5-CONSUME미디어 consume/resume 실패3회 / 임계 1진행자 화면에서 아동 또는 AI 오디오/영상이 붙지 않는다.
CONSOLE|Failed to consume existing producers:CONSOLE|Failed to consume existing producers:CONSOLE|Failed to consume existing producers:749697d8-f51f-4b96-bbfd-116b3553bf9f_16B1-AI-STARTAI 세션 시작 실패2회 / 임계 1핑퐁이와 대화를 시작하지 못해 수업 진행 자체가 막힌다.
AI_SESSION|Failed to start sessionAI_SESSION|Failed to start session (handler)B2-AGENT-READYLiveKit 에이전트 준비 타임아웃2회 / 임계 1에이전트가 방에 붙지 않아 AI가 응답할 수 없다.
LIVEKIT_CLIENT_SESSION|LiveKit agent readiness wait failedUNHANDLED_REJECTION|LiveKitAgentReadinessTimeoutError: LiveKit agent readiness timed outD9-VIDEO-REBUF영상 리버퍼링/디코드 과부하12회 / 임계 12영상이 끊기거나 멈춘다.
MEET_VIDEO|Video waiting [SEEK_REBUFFER]MEET_VIDEO|Video waiting [SEEK_REBUFFER]MEET_VIDEO|Video waiting [SEEK_REBUFFER]8cda93a3-482e-48c3-8a81-b098d1051ac6_3B5-REENTRY재입장 루프9회 / 임계 1아동 화면이 반복 재입장에 갇힌다.
GUEST_ENTRY|Re-entry loop detectedGUEST_ENTRY|Re-entry loop detectedGUEST_ENTRY|Re-entry loop detected7b4b524c-aa93-42b8-af8d-d91e742ed0af_6B5-REENTRY재입장 루프1회 / 임계 1아동 화면이 반복 재입장에 갇힌다.
GUEST_ENTRY|Re-entry loop detected진행은 됐으나 체감 품질이 손상된 세션. 룰 ID로 필터해 같은 계열끼리 묶어 본다.
| 아동 | 회기 | 시작 | 룰 | 기존 포맷 |
|---|---|---|---|---|
| 박서현 | 40 | 08:53 | D8-OUTPUT-SILENT D9-VIDEO-REBUF | 신규 |
| 이도윤 | 1 | 08:57 | D5-CONSUME D8-OUTPUT-SILENT D10-TRACK-LOST | 기존 확인 |
| 김강민 | 2 | 09:55 | D8-OUTPUT-SILENT | 신규 |
| 김지안 | 17 | 11:28 | D9-VIDEO-REBUF | 신규 |
| 한유안 | 1 | 13:54 | D10-TRACK-LOST | 기존 확인 |
| 김이솔 | 1 | 14:00 | D7-AI-AUDIO-STALL | 신규 |
| 박건우 | 13 | 14:00 | D11-MIC-RACE | 신규 |
| 고지효 | 2 | 14:25 | D9-VIDEO-REBUF | 신규 |
| 권나연 | 5 | 14:53 | D3-INTERRUPT D11-MIC-RACE D10-TRACK-LOST | 기존 확인 |
| 김예준 | 2 | 15:28 | D10-TRACK-LOST | 신규 |
| 유인지 | 2 | 15:30 | D10-TRACK-LOST | 신규 |
| 나현우 | 60 | 16:00 | D4-UPLINK D11-MIC-RACE | 신규 |
| 신리안 | 11 | 16:51 | D8-OUTPUT-SILENT | 기존 긴급 |
| 박소연 | 9 | 16:57 | D4-UPLINK D5-CONSUME D11-MIC-RACE | 기존 확인 |
| 이다은 | 2 | 16:59 | D2-NO-RESP | 신규 |
| 김하승 | 37 | 17:00 | D11-MIC-RACE D10-TRACK-LOST | 기존 확인 |
| 김주원 | 2 | 17:23 | D10-TRACK-LOST | 신규 |
| 김리아 | 1 | 17:27 | D4-UPLINK D6-TRANSPORT D8-OUTPUT-SILENT | 기존 확인 |
| 이다인 | 3 | 17:30 | D1-INPUT-SYNC D8-OUTPUT-SILENT | 기존 확인 |
| 고가빈 | 5 | 17:47 | D5-CONSUME D8-OUTPUT-SILENT | 기존 확인 |
| 이수원 | 7 | 17:55 | D8-OUTPUT-SILENT D9-VIDEO-REBUF | 기존 긴급 |
| 김시원 | 61 | 18:24 | D1-INPUT-SYNC D2-NO-RESP D3-INTERRUPT D4-UPLINK D6-TRANSPORT D7-AI-AUDIO-STALL D11-MIC-RACE | 기존 확인 |
| 최윤호 | 36 | 18:27 | D8-OUTPUT-SILENT D10-TRACK-LOST | 신규 |
| 반세경 | 61 | 18:29 | D2-NO-RESP D4-UPLINK D5-CONSUME D9-VIDEO-REBUF | 기존 확인 |
| 황도경 | 1 | 18:45 | D8-OUTPUT-SILENT | 신규 |
| 지윤우 | 9 | 18:52 | D8-OUTPUT-SILENT | 신규 |
| 정현준 | 10 | 18:53 | D5-CONSUME D8-OUTPUT-SILENT | 기존 확인 |
| 이여준 | 31 | 18:57 | D10-TRACK-LOST | 신규 |
| 이도훈 | 6 | 18:57 | D10-TRACK-LOST | 신규 |
| 박서준 | 25 | 19:00 | D10-TRACK-LOST | 신규 |
| 길주한 | 32 | 19:23 | D8-OUTPUT-SILENT D9-VIDEO-REBUF | 신규 |
| 김승준 | 10 | 19:24 | D9-VIDEO-REBUF | 신규 |
| 백지훈 | 15 | 19:24 | D5-CONSUME D8-OUTPUT-SILENT D11-MIC-RACE D10-TRACK-LOST | 기존 확인 |
| 손예승 | 1 | 19:26 | D8-OUTPUT-SILENT | 기존 확인 |
| 송준우 | 1 | 19:26 | D2-NO-RESP D5-CONSUME | 기존 확인 |
| 김이안 | 2 | 19:27 | D9-VIDEO-REBUF | 신규 |
| 김시율 | 1 | 19:27 | D8-OUTPUT-SILENT | 신규 |
| 조유진 | 22 | 19:30 | D1-INPUT-SYNC D2-NO-RESP D3-INTERRUPT D4-UPLINK D10-TRACK-LOST | 기존 확인 |
| 배예찬 | 27 | 19:32 | D10-TRACK-LOST | 신규 |
| 정아인 | 15 | 19:40 | D10-TRACK-LOST | 신규 |
| 신지호 | 37 | 19:51 | D9-VIDEO-REBUF | 신규 |
| 이시율 | 2 | 19:59 | D7-AI-AUDIO-STALL | 신규 |
| 김동겸 | 41 | 19:59 | D11-MIC-RACE | 신규 |
| 안시하 | 6 | 19:59 | D9-VIDEO-REBUF | 신규 |
| 김지웅 | 8 | 20:00 | D10-TRACK-LOST | 신규 |
| 김규린 | 31 | 20:00 | D11-MIC-RACE | 신규 |
| 이하온 | 1 | 20:00 | D10-TRACK-LOST | 신규 |
| 안준우 | 48 | 20:00 | D11-MIC-RACE D10-TRACK-LOST | 신규 |
| 현다빈 | 9 | 20:00 | D7-AI-AUDIO-STALL | 신규 |
| 김성운 | 35 | 20:00 | D8-OUTPUT-SILENT | 신규 |
| 김유담 | 17 | 20:02 | D4-UPLINK | 신규 |
| 나한결 | 2 | 20:22 | D1-INPUT-SYNC | 기존 확인 |
| 강수현 | 1 | 20:25 | D8-OUTPUT-SILENT | 신규 |
| 신가윤 | 44 | 20:27 | D2-NO-RESP | 신규 |
| 김설민 | 19 | 20:30 | D8-OUTPUT-SILENT | 신규 |
| 서승연 | 1 | 20:30 | D8-OUTPUT-SILENT | 신규 |
| 정윤구 | 36 | 20:30 | D11-MIC-RACE D10-TRACK-LOST | 신규 |
| 황정빈 | 14 | 20:30 | D8-OUTPUT-SILENT | 신규 |
| 안태빈 | 39 | 20:30 | D8-OUTPUT-SILENT | 신규 |
| 이주원 | 11 | 20:30 | D1-INPUT-SYNC | 기존 확인 |
| 정리베 | 9 | 20:31 | D10-TRACK-LOST | 신규 |
| 이예림 | 2 | 20:53 | D8-OUTPUT-SILENT | 신규 |
| 곽태규 | 1 | 20:56 | D6-TRANSPORT | 기존 확인 |
| 김서윤 | 7 | 21:00 | D1-INPUT-SYNC D4-UPLINK | 기존 확인 |
| 김현서 | 19 | 21:00 | D10-TRACK-LOST | 신규 |
| 백지호 | 12 | 21:00 | D1-INPUT-SYNC D11-MIC-RACE D10-TRACK-LOST | 기존 확인 |
| 김영준 | 35 | 21:04 | D8-OUTPUT-SILENT | 기존 확인 |
Failed to produce mic audio: queue stopped는 활동 전환 중 producer 재초기화 경합으로 보이나, 후속 producer 생성 성공 로그가 없어 실제 무음으로 이어졌는지 확정할 수 없다. 모니터 무음 신고와 교차 대조가 필요하다.prod/lesson-logs/에서 archives/lesson-log-20260824.jsonl.gz 233개를 받아 룰을 적용했다.
아동명은 ppi-user-prod의 id → name으로 붙였다.