{
  "format": "espanol2-intensive-outline",
  "version": 1,
  "generatedAt": "2026-05-06T09:21:38.281Z",
  "course": {
    "baseCourseId": "latam-es-ko-absolute-beginner-90d",
    "title": "Spanish for Korean Adults: Intensive Continuation Days 91-180",
    "learnerProfile": "Korean-speaking adult absolute beginner",
    "dialect": "Mexico-leaning neutral Latin American Spanish",
    "explanationLanguage": "ko-primary",
    "requiredDailyMinutes": 60,
    "optionalBoosterMinutes": 30,
    "targetOutcome": "Confident A2 conversation"
  },
  "summaryKo": "기존 90일 기초 과정을 마친 한국인 성인 학습자가 60분 필수 학습과 30분 선택 부스터로 A2 수준의 실전 대화 자신감을 만드는 91-180일 로드맵입니다.",
  "designPrinciplesKo": [
    "새로운 정답 암기보다 이미 배운 표현을 더 빠르고 오래 꺼내는 데 집중합니다.",
    "매일 필수 60분은 과부하를 막고, 선택 30분은 에너지가 있을 때만 확장합니다.",
    "읽기와 듣기는 완전 번역이 아니라 필요한 정보 찾기와 말하기 재사용을 목표로 합니다.",
    "매주 말하기 체크포인트와 약한 단어 회복일을 넣어 누적 부담을 줄입니다."
  ],
  "diagnosticGate": {
    "afterDay": 90,
    "koreanInstruction": "91일차를 시작하기 전에 90일차 최종 말하기 시험, 약한 단어 목록, 최근 SRS 연체량, 말하기 자신감 점수를 확인합니다.",
    "readinessKo": "완벽한 문법보다 '시작하기, 다시 묻기, 고쳐 말하기, 마무리하기'가 가능하면 Phase 2를 시작할 수 있습니다."
  },
  "intensiveStructure": {
    "required60": [
      "review",
      "new_pattern",
      "input",
      "speaking_reps",
      "checkout"
    ],
    "optional30": [
      "shadowing",
      "sentence_expansion",
      "role_play",
      "writing",
      "listening_dictation"
    ],
    "missedDayRecoveryKo": "하루를 놓치면 새 내용을 두 배로 하지 않고, 다음 날 필수 60분에서 review 시간을 15분으로 늘리고 부스터는 생략합니다.",
    "confidenceTrackingKo": "체크아웃에서 말하기 자신감 1-5점, 오늘 쓴 핵심 문장, 막힌 단어를 기록합니다."
  },
  "totals": {
    "modules": 6,
    "weeks": 13,
    "days": 90,
    "plannedDays": 90,
    "requiredMinutes": 5400,
    "optionalBoosterMinutes": 2700
  },
  "modules": [
    {
      "moduleId": "p2m01-fluency-repair",
      "startDay": 91,
      "endDay": 105,
      "koreanName": "유창성 회복과 대화 유지",
      "koreanGoal": "이미 아는 표현을 더 빠르게 꺼내고, 막혔을 때도 대화를 끊지 않는 회복력을 만듭니다.",
      "learnerPromiseKo": "완벽하지 않아도 짧게 고치고 다시 이어 말할 수 있습니다.",
      "englishFocus": "Stronger daily conversation, fluency repair, and turn-taking",
      "cefrTarget": "A1+ to A2 foundation",
      "days": [
        91,
        92,
        93,
        94,
        95,
        96,
        97,
        98,
        99,
        100,
        101,
        102,
        103,
        104,
        105
      ],
      "grammarPatternIds": [
        "p2-pat-91-hace-tiempo-que-no",
        "p2-pat-92-dejame-pensar-lo-que-quiero-decir-es",
        "p2-pat-93-y-tu-como-fue",
        "p2-pat-94-quieres-decir-que",
        "p2-pat-95-lo-digo-otra-vez-mas-despacio",
        "p2-pat-96-no-estoy-seguro-pero-creo-que",
        "p2-pat-97-el-problema-es-que",
        "p2-pat-98-ah-que-bien-entonces",
        "p2-pat-99-primero-despues-al-final",
        "p2-pat-100-me-podria-ayudar-con",
        "p2-pat-101-entonces-tengo-que",
        "p2-pat-102-perdon-empiezo-otra-vez",
        "p2-pat-103-para-mi-porque-por-ejemplo",
        "p2-pat-104-si-no-entiendo-puedo-preguntar-otra-",
        "p2-pat-105-no-hablo-perfecto-pero-puedo-comunic"
      ]
    },
    {
      "moduleId": "p2m02-stories-plans-history",
      "startDay": 106,
      "endDay": 120,
      "koreanName": "과거 이야기, 미래 계획, 개인사",
      "koreanGoal": "과거 경험과 앞으로의 계획을 연결해 자기 이야기를 더 길고 자연스럽게 말합니다.",
      "learnerPromiseKo": "내가 해 온 일, 지금 하는 일, 앞으로 하고 싶은 일을 한 흐름으로 설명할 수 있습니다.",
      "englishFocus": "Past stories, future plans, and personal history",
      "cefrTarget": "A2",
      "days": [
        106,
        107,
        108,
        109,
        110,
        111,
        112,
        113,
        114,
        115,
        116,
        117,
        118,
        119,
        120
      ],
      "grammarPatternIds": [
        "p2-pat-106-ayer-fui-a-porque",
        "p2-pat-107-esta-semana-he",
        "p2-pat-108-naci-en-despues-vivi-en",
        "p2-pat-109-de-nino-nina-ahora",
        "p2-pat-110-si-puedo-si-no",
        "p2-pat-111-mi-meta-es-entonces-voy-a",
        "p2-pat-112-creo-que-va-a",
        "p2-pat-113-te-invito-porque",
        "p2-pat-114-perdon-necesito-cambiar",
        "p2-pat-115-tuve-un-problema-pero",
        "p2-pat-116-lo-mejor-fue-lo-dificil-fue",
        "p2-pat-117-estudie-trabaje-en",
        "p2-pat-118-decidi-porque",
        "p2-pat-119-antes-ahora-despues",
        "p2-pat-120-esta-es-mi-historia-en-espanol"
      ]
    },
    {
      "moduleId": "p2m03-opinions-relationships",
      "startDay": 121,
      "endDay": 135,
      "koreanName": "의견, 관계, 선호와 공손한 반대",
      "koreanGoal": "취향과 의견을 더 풍부하게 말하고, 사람들과 의견이 다를 때도 관계를 유지합니다.",
      "learnerPromiseKo": "좋아한다/싫어한다를 넘어서 이유, 조건, 양보, 반대를 말할 수 있습니다.",
      "englishFocus": "Opinions, relationships, preferences, and polite disagreement",
      "cefrTarget": "A2",
      "days": [
        121,
        122,
        123,
        124,
        125,
        126,
        127,
        128,
        129,
        130,
        131,
        132,
        133,
        134,
        135
      ],
      "grammarPatternIds": [
        "p2-pat-121-prefiero-porque",
        "p2-pat-122-me-gusta-cuando",
        "p2-pat-123-te-recomiendo-porque",
        "p2-pat-124-estoy-de-acuerdo-pero-tambien",
        "p2-pat-125-entiendo-tu-punto-pero",
        "p2-pat-126-nos-conocemos-porque",
        "p2-pat-127-es-una-persona-siempre",
        "p2-pat-128-para-mi-esta-bien-pero-no",
        "p2-pat-129-perdon-por-es-que",
        "p2-pat-130-que-bonito-gracias-que-amable",
        "p2-pat-131-que-te-parece-si",
        "p2-pat-132-para-mi-es-importante",
        "p2-pat-133-mi-opinion-es-primero-segundo",
        "p2-pat-134-podemos-buscar-una-opcion-que-funcio",
        "p2-pat-135-no-pensamos-igual-pero-podemos-habla"
      ]
    },
    {
      "moduleId": "p2m04-services-admin-problems",
      "startDay": 136,
      "endDay": 150,
      "koreanName": "서비스, 주거, 건강, 행정 문제 해결",
      "koreanGoal": "생활에서 실제로 생기는 문제를 더 정확히 설명하고 필요한 조치를 요청합니다.",
      "learnerPromiseKo": "복잡한 상황에서도 문제, 배경, 요청, 다음 단계를 차분하게 말할 수 있습니다.",
      "englishFocus": "Services, housing, health, administration, and problem solving",
      "cefrTarget": "A2",
      "days": [
        136,
        137,
        138,
        139,
        140,
        141,
        142,
        143,
        144,
        145,
        146,
        147,
        148,
        149,
        150
      ],
      "grammarPatternIds": [
        "p2-pat-136-no-funciona-pueden-revisarlo",
        "p2-pat-137-a-que-hora-pueden-venir",
        "p2-pat-138-que-incluye-la-renta",
        "p2-pat-139-se-rompio-en",
        "p2-pat-140-soy-alergico-alergica-a",
        "p2-pat-141-empezo-hace-y-ahora",
        "p2-pat-142-necesito-algo-que-no-me-de-sueno",
        "p2-pat-143-hice-una-transferencia-pero",
        "p2-pat-144-necesito-original-o-copia",
        "p2-pat-145-que-pongo-en-esta-parte",
        "p2-pat-146-perdi-tiene",
        "p2-pat-147-hay-reembolso-o-cambio",
        "p2-pat-148-es-urgente-necesito-ayuda-en",
        "p2-pat-149-el-problema-es-necesito-que-puedo-ha",
        "p2-pat-150-quiero-resolver-esto-hoy-si-es-posib"
      ]
    },
    {
      "moduleId": "p2m05-real-world-input",
      "startDay": 151,
      "endDay": 165,
      "koreanName": "실전 읽기와 듣기 입력",
      "koreanGoal": "메뉴, 공지, 음성 메시지, 안내 방송처럼 실제 입력에서 필요한 정보를 찾아 말로 재사용합니다.",
      "learnerPromiseKo": "모든 단어를 몰라도 목적에 맞는 정보를 찾고, 확인 질문으로 연결할 수 있습니다.",
      "englishFocus": "Practical reading and listening from real-world input",
      "cefrTarget": "A2 consolidation",
      "days": [
        151,
        152,
        153,
        154,
        155,
        156,
        157,
        158,
        159,
        160,
        161,
        162,
        163,
        164,
        165
      ],
      "grammarPatternIds": [
        "p2-pat-151-el-letrero-dice-que",
        "p2-pat-152-este-platillo-lleva",
        "p2-pat-153-el-mensaje-dice-que-cambio",
        "p2-pat-154-el-mensaje-es-para",
        "p2-pat-155-anunciaron-que",
        "p2-pat-156-segun-las-resenas",
        "p2-pat-157-primero-hay-que",
        "p2-pat-158-esta-opcion-es-mas-pero",
        "p2-pat-159-en-el-chat-ella-pregunta-si",
        "p2-pat-160-escuche-que-cuesta",
        "p2-pat-161-parece-que-esta",
        "p2-pat-162-entonces-voy-a",
        "p2-pat-163-busco-la-informacion-sobre",
        "p2-pat-164-con-esta-informacion-podemos",
        "p2-pat-165-no-entiendo-todo-pero-entiendo-lo-im"
      ]
    },
    {
      "moduleId": "p2m06-a2-integration",
      "startDay": 166,
      "endDay": 180,
      "koreanName": "A2 통합 미션과 회복",
      "koreanGoal": "여러 상황을 섞은 긴 미션을 수행하고, 약한 영역을 회복해 A2 자신감을 고정합니다.",
      "learnerPromiseKo": "여행, 생활, 관계, 문제 해결을 한 대화 안에서 연결하고 스스로 마무리할 수 있습니다.",
      "englishFocus": "A2 integration missions, speaking tests, and recovery",
      "cefrTarget": "Confident A2",
      "days": [
        166,
        167,
        168,
        169,
        170,
        171,
        172,
        173,
        174,
        175,
        176,
        177,
        178,
        179,
        180
      ],
      "grammarPatternIds": [
        "p2-pat-166-todavia-necesito-practicar",
        "p2-pat-167-durante-el-viaje-necesito",
        "p2-pat-168-tengo-que-hacer-varios-mandados",
        "p2-pat-169-me-gustaria-conocer-mas-personas",
        "p2-pat-170-necesito-resolver-un-problema-en-mi-",
        "p2-pat-171-me-siento-mal-desde",
        "p2-pat-172-estoy-avanzando-pero-necesito",
        "p2-pat-173-podemos-estar-de-acuerdo-en",
        "p2-pat-174-al-principio-luego-aprendi-que",
        "p2-pat-175-quiero-volver-a-practicar-estas-pala",
        "p2-pat-176-voy-a-responder-simple-y-claro",
        "p2-pat-177-puede-repetir-la-parte-de",
        "p2-pat-178-voy-a-manejar-la-situacion-paso-a-pa",
        "p2-pat-179-puedo-comunicarme-en-situaciones-rea",
        "p2-pat-180-mi-siguiente-paso-es"
      ]
    }
  ],
  "weeks": [
    {
      "week": 14,
      "startDay": 91,
      "endDay": 97,
      "koreanTitle": "14주차: 오랜만에 안부 묻기에서 짧게 상황 설명하기까지",
      "koreanGoal": "유창성 회복과 대화 유지 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 문제를 한 문장으로 끝내지 않고 배경을 한 문장 더 붙입니다.",
      "englishFocus": "Natural catch-up conversation -> Short explanations",
      "moduleIds": [
        "p2m01-fluency-repair"
      ],
      "days": [
        91,
        92,
        93,
        94,
        95,
        96,
        97
      ],
      "cefrTargets": [
        "A1+ to A2 foundation"
      ]
    },
    {
      "week": 15,
      "startDay": 98,
      "endDay": 104,
      "koreanTitle": "15주차: 맞장구와 반응 신호에서 대화 유지 주간 복습까지",
      "koreanGoal": "유창성 회복과 대화 유지 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 이번 주 표현을 섞어 2분 대화를 버팁니다.",
      "englishFocus": "Turn-taking signals -> Week review conversation",
      "moduleIds": [
        "p2m01-fluency-repair"
      ],
      "days": [
        98,
        99,
        100,
        101,
        102,
        103,
        104
      ],
      "cefrTargets": [
        "A1+ to A2 foundation"
      ]
    },
    {
      "week": 16,
      "startDay": 105,
      "endDay": 111,
      "koreanTitle": "16주차: 말하기 체크포인트 3에서 미래 목표와 다음 행동까지",
      "koreanGoal": "유창성 회복과 대화 유지 / 과거 이야기, 미래 계획, 개인사 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 큰 목표를 말하고 다음 작은 행동을 구체화합니다.",
      "englishFocus": "Speaking checkpoint 3 -> Future goals",
      "moduleIds": [
        "p2m01-fluency-repair",
        "p2m02-stories-plans-history"
      ],
      "days": [
        105,
        106,
        107,
        108,
        109,
        110,
        111
      ],
      "cefrTargets": [
        "A1+ to A2 foundation",
        "A2"
      ]
    },
    {
      "week": 17,
      "startDay": 112,
      "endDay": 118,
      "koreanTitle": "17주차: 간단한 예측에서 결정 이유 설명까지",
      "koreanGoal": "과거 이야기, 미래 계획, 개인사 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 어떤 결정을 내린 이유를 짧게 설명합니다.",
      "englishFocus": "Making predictions -> Explaining decisions",
      "moduleIds": [
        "p2m02-stories-plans-history"
      ],
      "days": [
        112,
        113,
        114,
        115,
        116,
        117,
        118
      ],
      "cefrTargets": [
        "A2"
      ]
    },
    {
      "week": 18,
      "startDay": 119,
      "endDay": 125,
      "koreanTitle": "18주차: 과거-현재-미래 통합에서 공손한 반대까지",
      "koreanGoal": "과거 이야기, 미래 계획, 개인사 / 의견, 관계, 선호와 공손한 반대 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 상대 의견을 인정하면서 부드럽게 다른 생각을 말합니다.",
      "englishFocus": "Narrative review -> Polite disagreement",
      "moduleIds": [
        "p2m02-stories-plans-history",
        "p2m03-opinions-relationships"
      ],
      "days": [
        119,
        120,
        121,
        122,
        123,
        124,
        125
      ],
      "cefrTargets": [
        "A2"
      ]
    },
    {
      "week": 19,
      "startDay": 126,
      "endDay": 132,
      "koreanTitle": "19주차: 관계 설명하기에서 나에게 중요한 것까지",
      "koreanGoal": "의견, 관계, 선호와 공손한 반대 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 내 가치나 우선순위를 쉬운 문장으로 말합니다.",
      "englishFocus": "Explaining relationships -> Explaining values",
      "moduleIds": [
        "p2m03-opinions-relationships"
      ],
      "days": [
        126,
        127,
        128,
        129,
        130,
        131,
        132
      ],
      "cefrTargets": [
        "A2"
      ]
    },
    {
      "week": 20,
      "startDay": 133,
      "endDay": 139,
      "koreanTitle": "20주차: 미니 토론 준비에서 파손 신고까지",
      "koreanGoal": "의견, 관계, 선호와 공손한 반대 / 서비스, 주거, 건강, 행정 문제 해결 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 어디가 어떻게 고장났는지와 급한 정도를 말합니다.",
      "englishFocus": "Mini debate prep -> Reporting damage",
      "moduleIds": [
        "p2m03-opinions-relationships",
        "p2m04-services-admin-problems"
      ],
      "days": [
        133,
        134,
        135,
        136,
        137,
        138,
        139
      ],
      "cefrTargets": [
        "A2"
      ]
    },
    {
      "week": 21,
      "startDay": 140,
      "endDay": 146,
      "koreanTitle": "21주차: 기본 병력과 알레르기에서 분실물 신고까지",
      "koreanGoal": "서비스, 주거, 건강, 행정 문제 해결 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 잃어버린 물건의 장소, 시간, 특징을 설명합니다.",
      "englishFocus": "Medical history basics -> Lost item report",
      "moduleIds": [
        "p2m04-services-admin-problems"
      ],
      "days": [
        140,
        141,
        142,
        143,
        144,
        145,
        146
      ],
      "cefrTargets": [
        "A2"
      ]
    },
    {
      "week": 22,
      "startDay": 147,
      "endDay": 153,
      "koreanTitle": "22주차: 지연과 환불 문의에서 교통 변경 안내 읽기까지",
      "koreanGoal": "서비스, 주거, 건강, 행정 문제 해결 / 실전 읽기와 듣기 입력 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 지연, 변경, 플랫폼 정보를 찾아 이동 계획을 조정합니다.",
      "englishFocus": "Delay and compensation -> Reading transit updates",
      "moduleIds": [
        "p2m04-services-admin-problems",
        "p2m05-real-world-input"
      ],
      "days": [
        147,
        148,
        149,
        150,
        151,
        152,
        153
      ],
      "cefrTargets": [
        "A2",
        "A2 consolidation"
      ]
    },
    {
      "week": 23,
      "startDay": 154,
      "endDay": 160,
      "koreanTitle": "23주차: 음성 메시지 핵심 듣기에서 숫자 집중 듣기까지",
      "koreanGoal": "실전 읽기와 듣기 입력 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 가격, 시간, 전화번호, 주소를 놓치지 않게 듣습니다.",
      "englishFocus": "Voice message gist -> Listening for numbers",
      "moduleIds": [
        "p2m05-real-world-input"
      ],
      "days": [
        154,
        155,
        156,
        157,
        158,
        159,
        160
      ],
      "cefrTargets": [
        "A2 consolidation"
      ]
    },
    {
      "week": 24,
      "startDay": 161,
      "endDay": 167,
      "koreanTitle": "24주차: 감정 듣기에서 하루 여행 미션까지",
      "koreanGoal": "실전 읽기와 듣기 입력 / A2 통합 미션과 회복 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 이동, 식사, 숙소 문제를 하루 흐름으로 처리합니다.",
      "englishFocus": "Listening for emotion -> Full travel day mission",
      "moduleIds": [
        "p2m05-real-world-input",
        "p2m06-a2-integration"
      ],
      "days": [
        161,
        162,
        163,
        164,
        165,
        166,
        167
      ],
      "cefrTargets": [
        "A2 consolidation",
        "Confident A2"
      ]
    },
    {
      "week": 25,
      "startDay": 168,
      "endDay": 174,
      "koreanTitle": "25주차: 동네 생활 미션에서 개인 이야기 미션까지",
      "koreanGoal": "A2 통합 미션과 회복 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 시작, 문제, 변화, 배운 점이 있는 이야기를 말합니다.",
      "englishFocus": "Local life mission -> Story mission",
      "moduleIds": [
        "p2m06-a2-integration"
      ],
      "days": [
        168,
        169,
        170,
        171,
        172,
        173,
        174
      ],
      "cefrTargets": [
        "Confident A2"
      ]
    },
    {
      "week": 26,
      "startDay": 175,
      "endDay": 180,
      "koreanTitle": "26주차: 약한 단어 회복일에서 180일 회고와 다음 계획까지",
      "koreanGoal": "A2 통합 미션과 회복 흐름 안에서 필수 60분과 선택 30분 부스터를 사용해 A2 학습을 돌아보고 다음 30일 유지 계획을 세웁니다.",
      "englishFocus": "Weak-word recovery day -> Day 180 recovery and next plan",
      "moduleIds": [
        "p2m06-a2-integration"
      ],
      "days": [
        175,
        176,
        177,
        178,
        179,
        180
      ],
      "cefrTargets": [
        "Confident A2"
      ]
    }
  ],
  "days": [
    {
      "day": 91,
      "phaseDay": 1,
      "week": 14,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Natural catch-up conversation",
      "englishOutcome": "Start a casual conversation after a break and keep it warm.",
      "koreanTitle": "오랜만에 안부 묻기",
      "koreanGoal": "오랜만에 만난 사람에게 안부를 묻고 내 근황을 짧게 말합니다.",
      "grammar": {
        "id": "p2-pat-91-hace-tiempo-que-no",
        "name": "Hace tiempo que no...",
        "koreanName": "오랜만이라는 표현",
        "anchorSpanish": "Hace tiempo que no practico, pero quiero hablar más.",
        "anchorKorean": "오랫동안 연습하지 않았지만 더 말하고 싶어요."
      },
      "anchor": {
        "spanish": "Hace tiempo que no practico, pero quiero hablar más.",
        "korean": "오랫동안 연습하지 않았지만 더 말하고 싶어요."
      },
      "vocabDomain": {
        "english": "catch-up phrases",
        "korean": "안부, 근황, 다시 시작하기",
        "tags": [
          "p2m01-fluency-repair",
          "catch-up-phrases",
          "day-91"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 메신저 대화와 안부 문장을 읽고 흐름을 파악합니다.",
        "speakingKo": "상대의 근황을 묻고 내 최근 생활을 두 문장으로 말합니다.",
        "testKo": "코칭 없이 30초 안부 대화를 이어갑니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d91-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d91-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Hace tiempo que no...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d91-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 메신저 대화와 안부 문장을 읽고 흐름을 파악합니다."
          },
          {
            "id": "p2-d91-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "상대의 근황을 묻고 내 최근 생활을 두 문장으로 말합니다."
          },
          {
            "id": "p2-d91-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 92,
      "phaseDay": 2,
      "week": 14,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Keeping the floor",
      "englishOutcome": "Hold your turn while searching for words.",
      "koreanTitle": "말할 시간을 벌기",
      "koreanGoal": "단어가 바로 떠오르지 않아도 시간을 벌며 말을 이어갑니다.",
      "grammar": {
        "id": "p2-pat-92-dejame-pensar-lo-que-quiero-decir-es",
        "name": "Déjame pensar / Lo que quiero decir es...",
        "koreanName": "생각할 시간을 요청하기",
        "anchorSpanish": "Déjame pensar un momento; lo que quiero decir es que necesito practicar.",
        "anchorKorean": "잠깐 생각해 볼게요. 제가 말하고 싶은 건 연습이 필요하다는 거예요."
      },
      "anchor": {
        "spanish": "Déjame pensar un momento; lo que quiero decir es que necesito practicar.",
        "korean": "잠깐 생각해 볼게요. 제가 말하고 싶은 건 연습이 필요하다는 거예요."
      },
      "vocabDomain": {
        "english": "conversation fillers",
        "korean": "생각하기, 정리하기, 다시 말하기",
        "tags": [
          "p2m01-fluency-repair",
          "conversation-fillers",
          "day-92"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 인터뷰 답변에서 시간을 버는 표현을 찾아봅니다.",
        "speakingKo": "생각할 시간을 요청한 뒤 같은 내용을 더 쉽게 다시 말합니다.",
        "testKo": "모르는 단어가 있어도 대화를 멈추지 않습니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d92-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d92-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Déjame pensar / Lo que quiero decir es...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d92-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 인터뷰 답변에서 시간을 버는 표현을 찾아봅니다."
          },
          {
            "id": "p2-d92-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "생각할 시간을 요청한 뒤 같은 내용을 더 쉽게 다시 말합니다."
          },
          {
            "id": "p2-d92-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 93,
      "phaseDay": 3,
      "week": 14,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Follow-up questions",
      "englishOutcome": "Ask useful follow-up questions instead of ending the exchange.",
      "koreanTitle": "후속 질문으로 이어가기",
      "koreanGoal": "상대가 한 말에 대해 자연스럽게 한 가지 더 묻습니다.",
      "grammar": {
        "id": "p2-pat-93-y-tu-como-fue",
        "name": "¿Y tú? / ¿Cómo fue?",
        "koreanName": "되묻기와 후속 질문",
        "anchorSpanish": "Me gusta cocinar en casa. ¿Y tú? ¿Qué cocinas normalmente?",
        "anchorKorean": "저는 집에서 요리하는 것을 좋아해요. 당신은요? 보통 무엇을 요리해요?"
      },
      "anchor": {
        "spanish": "Me gusta cocinar en casa. ¿Y tú? ¿Qué cocinas normalmente?",
        "korean": "저는 집에서 요리하는 것을 좋아해요. 당신은요? 보통 무엇을 요리해요?"
      },
      "vocabDomain": {
        "english": "follow-up questions",
        "korean": "되묻기, 이유 묻기, 경험 묻기",
        "tags": [
          "p2m01-fluency-repair",
          "follow-up-questions",
          "day-93"
        ]
      },
      "focus": {
        "readingListeningKo": "두 사람이 취미를 말하는 짧은 대화를 읽고 질문 위치를 봅니다.",
        "speakingKo": "상대 답변마다 후속 질문 하나를 붙입니다.",
        "testKo": "질문 세 개로 대화를 최소 1분 유지합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d93-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d93-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'¿Y tú? / ¿Cómo fue?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d93-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "두 사람이 취미를 말하는 짧은 대화를 읽고 질문 위치를 봅니다."
          },
          {
            "id": "p2-d93-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "상대 답변마다 후속 질문 하나를 붙입니다."
          },
          {
            "id": "p2-d93-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 94,
      "phaseDay": 4,
      "week": 14,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Clarifying gently",
      "englishOutcome": "Clarify meaning without sounding abrupt.",
      "koreanTitle": "부드럽게 뜻 확인하기",
      "koreanGoal": "이해가 애매한 표현을 공손하게 다시 확인합니다.",
      "grammar": {
        "id": "p2-pat-94-quieres-decir-que",
        "name": "¿Quieres decir que...?",
        "koreanName": "상대 의도 확인하기",
        "anchorSpanish": "¿Quieres decir que la reunión es mañana, no hoy?",
        "anchorKorean": "회의가 오늘이 아니라 내일이라는 뜻인가요?"
      },
      "anchor": {
        "spanish": "¿Quieres decir que la reunión es mañana, no hoy?",
        "korean": "회의가 오늘이 아니라 내일이라는 뜻인가요?"
      },
      "vocabDomain": {
        "english": "clarification",
        "korean": "뜻 확인, 일정 확인, 오해 줄이기",
        "tags": [
          "p2m01-fluency-repair",
          "clarification",
          "day-94"
        ]
      },
      "focus": {
        "readingListeningKo": "일정 변경 메시지를 읽고 확인 질문을 만듭니다.",
        "speakingKo": "상대 말의 핵심을 다시 말하고 맞는지 묻습니다.",
        "testKo": "두 가지 애매한 정보를 정확히 확인합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d94-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d94-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'¿Quieres decir que...?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d94-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "일정 변경 메시지를 읽고 확인 질문을 만듭니다."
          },
          {
            "id": "p2-d94-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "상대 말의 핵심을 다시 말하고 맞는지 묻습니다."
          },
          {
            "id": "p2-d94-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 95,
      "phaseDay": 5,
      "week": 14,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Repairing pronunciation",
      "englishOutcome": "Notice and repair words the listener did not catch.",
      "koreanTitle": "발음이 안 통할 때 고치기",
      "koreanGoal": "못 알아들었다는 반응을 받았을 때 천천히 다시 말합니다.",
      "grammar": {
        "id": "p2-pat-95-lo-digo-otra-vez-mas-despacio",
        "name": "Lo digo otra vez más despacio.",
        "koreanName": "천천히 다시 말하기",
        "anchorSpanish": "Perdón, lo digo otra vez más despacio: necesito una cita.",
        "anchorKorean": "죄송해요, 더 천천히 다시 말할게요. 예약이 필요해요."
      },
      "anchor": {
        "spanish": "Perdón, lo digo otra vez más despacio: necesito una cita.",
        "korean": "죄송해요, 더 천천히 다시 말할게요. 예약이 필요해요."
      },
      "vocabDomain": {
        "english": "pronunciation repair",
        "korean": "다시 말하기, 천천히, 철자 말하기",
        "tags": [
          "p2m01-fluency-repair",
          "pronunciation-repair",
          "day-95"
        ]
      },
      "focus": {
        "readingListeningKo": "전화 예약 대화를 읽고 반복 요청 표현을 표시합니다.",
        "speakingKo": "어려운 단어를 천천히 반복하고 철자를 말합니다.",
        "testKo": "발음 때문에 막힌 상황을 스스로 복구합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d95-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d95-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Lo digo otra vez más despacio.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d95-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "전화 예약 대화를 읽고 반복 요청 표현을 표시합니다."
          },
          {
            "id": "p2-d95-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "어려운 단어를 천천히 반복하고 철자를 말합니다."
          },
          {
            "id": "p2-d95-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 96,
      "phaseDay": 6,
      "week": 14,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Expressing uncertainty",
      "englishOutcome": "Say what you know and what you are unsure about.",
      "koreanTitle": "확실하지 않음 표현하기",
      "koreanGoal": "확실한 정보와 모르는 정보를 나누어 말합니다.",
      "grammar": {
        "id": "p2-pat-96-no-estoy-seguro-pero-creo-que",
        "name": "No estoy seguro, pero creo que...",
        "koreanName": "확신 정도 말하기",
        "anchorSpanish": "No estoy seguro, pero creo que el banco cierra a las cuatro.",
        "anchorKorean": "확실하지는 않지만 은행은 네 시에 닫는 것 같아요."
      },
      "anchor": {
        "spanish": "No estoy seguro, pero creo que el banco cierra a las cuatro.",
        "korean": "확실하지는 않지만 은행은 네 시에 닫는 것 같아요."
      },
      "vocabDomain": {
        "english": "certainty",
        "korean": "확실함, 추측, 확인 필요",
        "tags": [
          "p2m01-fluency-repair",
          "certainty",
          "day-96"
        ]
      },
      "focus": {
        "readingListeningKo": "공지문과 추측 문장을 비교해 읽습니다.",
        "speakingKo": "확실하지 않은 정보를 말하고 확인이 필요하다고 덧붙입니다.",
        "testKo": "추측과 사실을 구분해서 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d96-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d96-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'No estoy seguro, pero creo que...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d96-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "공지문과 추측 문장을 비교해 읽습니다."
          },
          {
            "id": "p2-d96-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "확실하지 않은 정보를 말하고 확인이 필요하다고 덧붙입니다."
          },
          {
            "id": "p2-d96-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 97,
      "phaseDay": 7,
      "week": 14,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Short explanations",
      "englishOutcome": "Explain a small situation in two or three simple sentences.",
      "koreanTitle": "짧게 상황 설명하기",
      "koreanGoal": "문제를 한 문장으로 끝내지 않고 배경을 한 문장 더 붙입니다.",
      "grammar": {
        "id": "p2-pat-97-el-problema-es-que",
        "name": "El problema es que...",
        "koreanName": "문제 설명 시작하기",
        "anchorSpanish": "El problema es que mi tarjeta no funciona y necesito pagar ahora.",
        "anchorKorean": "문제는 제 카드가 작동하지 않고 지금 결제해야 한다는 거예요."
      },
      "anchor": {
        "spanish": "El problema es que mi tarjeta no funciona y necesito pagar ahora.",
        "korean": "문제는 제 카드가 작동하지 않고 지금 결제해야 한다는 거예요."
      },
      "vocabDomain": {
        "english": "problem explanation",
        "korean": "문제, 이유, 지금 필요한 것",
        "tags": [
          "p2m01-fluency-repair",
          "problem-explanation",
          "day-97"
        ]
      },
      "focus": {
        "readingListeningKo": "서비스 카운터 대화를 읽고 문제-이유-요청 구조를 봅니다.",
        "speakingKo": "문제, 이유, 원하는 해결을 세 문장으로 말합니다.",
        "testKo": "낯선 문제를 세 문장으로 설명합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d97-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d97-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'El problema es que...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d97-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "서비스 카운터 대화를 읽고 문제-이유-요청 구조를 봅니다."
          },
          {
            "id": "p2-d97-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "문제, 이유, 원하는 해결을 세 문장으로 말합니다."
          },
          {
            "id": "p2-d97-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 98,
      "phaseDay": 8,
      "week": 15,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Turn-taking signals",
      "englishOutcome": "Use small signals to agree, react, and continue.",
      "koreanTitle": "맞장구와 반응 신호",
      "koreanGoal": "상대 말에 짧게 반응하고 다음 질문으로 연결합니다.",
      "grammar": {
        "id": "p2-pat-98-ah-que-bien-entonces",
        "name": "Ah, qué bien. Entonces...",
        "koreanName": "반응 후 이어가기",
        "anchorSpanish": "Ah, qué bien. Entonces, ¿vas a ir con tus amigos?",
        "anchorKorean": "아, 좋네요. 그러면 친구들과 갈 거예요?"
      },
      "anchor": {
        "spanish": "Ah, qué bien. Entonces, ¿vas a ir con tus amigos?",
        "korean": "아, 좋네요. 그러면 친구들과 갈 거예요?"
      },
      "vocabDomain": {
        "english": "reaction phrases",
        "korean": "맞장구, 놀람, 이어 말하기",
        "tags": [
          "p2m01-fluency-repair",
          "reaction-phrases",
          "day-98"
        ]
      },
      "focus": {
        "readingListeningKo": "친근한 대화에서 반응 표현을 찾아 듣고 읽습니다.",
        "speakingKo": "상대 답변에 반응 표현 하나와 질문 하나를 붙입니다.",
        "testKo": "로봇처럼 묻지 않고 자연스럽게 반응합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d98-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d98-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Ah, qué bien. Entonces...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d98-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "친근한 대화에서 반응 표현을 찾아 듣고 읽습니다."
          },
          {
            "id": "p2-d98-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "상대 답변에 반응 표현 하나와 질문 하나를 붙입니다."
          },
          {
            "id": "p2-d98-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 99,
      "phaseDay": 9,
      "week": 15,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Summarizing what happened",
      "englishOutcome": "Summarize a small event clearly.",
      "koreanTitle": "무슨 일이 있었는지 요약하기",
      "koreanGoal": "일어난 일을 시간 순서와 핵심 결과로 짧게 요약합니다.",
      "grammar": {
        "id": "p2-pat-99-primero-despues-al-final",
        "name": "Primero... después... al final...",
        "koreanName": "순서 요약하기",
        "anchorSpanish": "Primero fui al banco, después esperé, y al final pude pagar.",
        "anchorKorean": "처음에 은행에 갔고, 그다음 기다렸고, 결국 결제할 수 있었어요."
      },
      "anchor": {
        "spanish": "Primero fui al banco, después esperé, y al final pude pagar.",
        "korean": "처음에 은행에 갔고, 그다음 기다렸고, 결국 결제할 수 있었어요."
      },
      "vocabDomain": {
        "english": "sequence recap",
        "korean": "처음, 다음, 결국, 결과",
        "tags": [
          "p2m01-fluency-repair",
          "sequence-recap",
          "day-99"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 하루 요약문을 읽고 순서 표현을 표시합니다.",
        "speakingKo": "오늘 있었던 일을 세 단계로 요약합니다.",
        "testKo": "제시된 그림 상황을 순서대로 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d99-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d99-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Primero... después... al final...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d99-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 하루 요약문을 읽고 순서 표현을 표시합니다."
          },
          {
            "id": "p2-d99-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "오늘 있었던 일을 세 단계로 요약합니다."
          },
          {
            "id": "p2-d99-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 100,
      "phaseDay": 10,
      "week": 15,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Softening requests",
      "englishOutcome": "Make requests sound warm and realistic.",
      "koreanTitle": "부드러운 요청",
      "koreanGoal": "명령처럼 들리지 않게 부탁 표현을 완성합니다.",
      "grammar": {
        "id": "p2-pat-100-me-podria-ayudar-con",
        "name": "¿Me podría ayudar con...?",
        "koreanName": "공손한 도움 요청",
        "anchorSpanish": "¿Me podría ayudar con esta dirección, por favor?",
        "anchorKorean": "이 주소를 좀 도와주실 수 있을까요?"
      },
      "anchor": {
        "spanish": "¿Me podría ayudar con esta dirección, por favor?",
        "korean": "이 주소를 좀 도와주실 수 있을까요?"
      },
      "vocabDomain": {
        "english": "soft requests",
        "korean": "공손함, 부탁, 감사",
        "tags": [
          "p2m01-fluency-repair",
          "soft-requests",
          "day-100"
        ]
      },
      "focus": {
        "readingListeningKo": "도움 요청 문장을 공손함 정도에 따라 비교합니다.",
        "speakingKo": "같은 요청을 직접형과 공손형으로 바꿔 말합니다.",
        "testKo": "공손하게 도움을 요청하고 감사 표현으로 마무리합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d100-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d100-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'¿Me podría ayudar con...?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d100-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "도움 요청 문장을 공손함 정도에 따라 비교합니다."
          },
          {
            "id": "p2-d100-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "같은 요청을 직접형과 공손형으로 바꿔 말합니다."
          },
          {
            "id": "p2-d100-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 101,
      "phaseDay": 11,
      "week": 15,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Checking assumptions",
      "englishOutcome": "Check assumptions before acting.",
      "koreanTitle": "추측 확인하기",
      "koreanGoal": "내가 이해한 조건이 맞는지 행동하기 전에 확인합니다.",
      "grammar": {
        "id": "p2-pat-101-entonces-tengo-que",
        "name": "Entonces, tengo que...",
        "koreanName": "조건 확인하기",
        "anchorSpanish": "Entonces, tengo que llenar este formulario y regresar mañana, ¿verdad?",
        "anchorKorean": "그러면 이 양식을 작성하고 내일 다시 와야 하는 거죠?"
      },
      "anchor": {
        "spanish": "Entonces, tengo que llenar este formulario y regresar mañana, ¿verdad?",
        "korean": "그러면 이 양식을 작성하고 내일 다시 와야 하는 거죠?"
      },
      "vocabDomain": {
        "english": "assumptions",
        "korean": "해야 할 일, 절차, 확인",
        "tags": [
          "p2m01-fluency-repair",
          "assumptions",
          "day-101"
        ]
      },
      "focus": {
        "readingListeningKo": "간단한 절차 안내문을 읽고 해야 할 일을 정리합니다.",
        "speakingKo": "들은 정보를 한 문장으로 요약하고 맞는지 묻습니다.",
        "testKo": "절차를 잘못 이해하지 않도록 확인 질문을 합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d101-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d101-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Entonces, tengo que...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d101-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "간단한 절차 안내문을 읽고 해야 할 일을 정리합니다."
          },
          {
            "id": "p2-d101-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "들은 정보를 한 문장으로 요약하고 맞는지 묻습니다."
          },
          {
            "id": "p2-d101-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 102,
      "phaseDay": 12,
      "week": 15,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Conversation recovery drill",
      "englishOutcome": "Recover after silence, mistakes, or missing words.",
      "koreanTitle": "침묵 후 다시 시작하기",
      "koreanGoal": "말이 끊겼을 때 짧은 회복 표현으로 다시 시작합니다.",
      "grammar": {
        "id": "p2-pat-102-perdon-empiezo-otra-vez",
        "name": "Perdón, empiezo otra vez.",
        "koreanName": "다시 시작하기",
        "anchorSpanish": "Perdón, empiezo otra vez: quiero pedir una cita para esta semana.",
        "anchorKorean": "죄송해요, 다시 시작할게요. 이번 주에 예약하고 싶어요."
      },
      "anchor": {
        "spanish": "Perdón, empiezo otra vez: quiero pedir una cita para esta semana.",
        "korean": "죄송해요, 다시 시작할게요. 이번 주에 예약하고 싶어요."
      },
      "vocabDomain": {
        "english": "recovery phrases",
        "korean": "다시 시작, 바꿔 말하기, 도움 요청",
        "tags": [
          "p2m01-fluency-repair",
          "recovery-phrases",
          "day-102"
        ]
      },
      "focus": {
        "readingListeningKo": "실수 후 고쳐 말하는 예문을 읽고 복구 표현을 표시합니다.",
        "speakingKo": "일부러 틀린 문장을 말한 뒤 바로 고쳐 말합니다.",
        "testKo": "실수 후에도 대화를 계속합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d102-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d102-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Perdón, empiezo otra vez.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d102-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "실수 후 고쳐 말하는 예문을 읽고 복구 표현을 표시합니다."
          },
          {
            "id": "p2-d102-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "일부러 틀린 문장을 말한 뒤 바로 고쳐 말합니다."
          },
          {
            "id": "p2-d102-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 103,
      "phaseDay": 13,
      "week": 15,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Longer answer building",
      "englishOutcome": "Build a 45-second answer from simple blocks.",
      "koreanTitle": "45초 답변 만들기",
      "koreanGoal": "주제, 이유, 예시, 마무리 순서로 짧은 발표를 만듭니다.",
      "grammar": {
        "id": "p2-pat-103-para-mi-porque-por-ejemplo",
        "name": "Para mí... porque... por ejemplo...",
        "koreanName": "이유와 예시 붙이기",
        "anchorSpanish": "Para mí, practicar cada día es importante porque me da confianza.",
        "anchorKorean": "저에게 매일 연습하는 것은 자신감을 주기 때문에 중요해요."
      },
      "anchor": {
        "spanish": "Para mí, practicar cada día es importante porque me da confianza.",
        "korean": "저에게 매일 연습하는 것은 자신감을 주기 때문에 중요해요."
      },
      "vocabDomain": {
        "english": "answer structure",
        "korean": "주제, 이유, 예시, 마무리",
        "tags": [
          "p2m01-fluency-repair",
          "answer-structure",
          "day-103"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 의견문을 읽고 이유와 예시를 구분합니다.",
        "speakingKo": "좋아하는 장소에 대해 45초 동안 말합니다.",
        "testKo": "말하기 답변에 이유와 예시를 반드시 넣습니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d103-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d103-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Para mí... porque... por ejemplo...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d103-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 의견문을 읽고 이유와 예시를 구분합니다."
          },
          {
            "id": "p2-d103-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "좋아하는 장소에 대해 45초 동안 말합니다."
          },
          {
            "id": "p2-d103-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 104,
      "phaseDay": 14,
      "week": 15,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Week review conversation",
      "englishOutcome": "Combine repair, follow-up, and short explanations.",
      "koreanTitle": "대화 유지 주간 복습",
      "koreanGoal": "이번 주 표현을 섞어 2분 대화를 버팁니다.",
      "grammar": {
        "id": "p2-pat-104-si-no-entiendo-puedo-preguntar-otra-",
        "name": "Si no entiendo, puedo preguntar otra vez.",
        "koreanName": "복구 전략 통합",
        "anchorSpanish": "Si no entiendo, puedo preguntar otra vez y seguir hablando.",
        "anchorKorean": "이해하지 못하면 다시 물어보고 계속 말할 수 있어요."
      },
      "anchor": {
        "spanish": "Si no entiendo, puedo preguntar otra vez y seguir hablando.",
        "korean": "이해하지 못하면 다시 물어보고 계속 말할 수 있어요."
      },
      "vocabDomain": {
        "english": "fluency review",
        "korean": "복구, 질문, 설명, 반응",
        "tags": [
          "p2m01-fluency-repair",
          "fluency-review",
          "day-104"
        ]
      },
      "focus": {
        "readingListeningKo": "복습 대화를 읽고 회복 표현을 모두 표시합니다.",
        "speakingKo": "모르는 단어가 있는 역할극에서도 질문하고 이어갑니다.",
        "testKo": "2분 대화에서 세 가지 복구 전략을 사용합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d104-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d104-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Si no entiendo, puedo preguntar otra vez.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d104-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "복습 대화를 읽고 회복 표현을 모두 표시합니다."
          },
          {
            "id": "p2-d104-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "모르는 단어가 있는 역할극에서도 질문하고 이어갑니다."
          },
          {
            "id": "p2-d104-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 105,
      "phaseDay": 15,
      "week": 16,
      "moduleId": "p2m01-fluency-repair",
      "canonicalStatus": "planned",
      "cefrTarget": "A1+ to A2 foundation",
      "englishTheme": "Speaking checkpoint 3",
      "englishOutcome": "Pass a fluency-repair speaking checkpoint.",
      "koreanTitle": "말하기 체크포인트 3",
      "koreanGoal": "코칭 없이도 말이 막히는 순간을 스스로 복구합니다.",
      "grammar": {
        "id": "p2-pat-105-no-hablo-perfecto-pero-puedo-comunic",
        "name": "No hablo perfecto, pero puedo comunicarme.",
        "koreanName": "자신감 문장",
        "anchorSpanish": "No hablo perfecto, pero puedo comunicarme y pedir ayuda.",
        "anchorKorean": "완벽하게 말하지는 않지만 의사소통하고 도움을 요청할 수 있어요."
      },
      "anchor": {
        "spanish": "No hablo perfecto, pero puedo comunicarme y pedir ayuda.",
        "korean": "완벽하게 말하지는 않지만 의사소통하고 도움을 요청할 수 있어요."
      },
      "vocabDomain": {
        "english": "checkpoint",
        "korean": "자기평가, 복구, 자신감",
        "tags": [
          "p2m01-fluency-repair",
          "checkpoint",
          "day-105"
        ]
      },
      "focus": {
        "readingListeningKo": "체크포인트 지시문을 읽고 평가 기준을 이해합니다.",
        "speakingKo": "무작위 일상 상황에서 3분 역할극을 합니다.",
        "testKo": "유창성보다 회복력과 의미 전달을 평가합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d105-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d105-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'No hablo perfecto, pero puedo comunicarme.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d105-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "체크포인트 지시문을 읽고 평가 기준을 이해합니다."
          },
          {
            "id": "p2-d105-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "무작위 일상 상황에서 3분 역할극을 합니다."
          },
          {
            "id": "p2-d105-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 106,
      "phaseDay": 16,
      "week": 16,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Yesterday with details",
      "englishOutcome": "Add place, time, and reason to yesterday stories.",
      "koreanTitle": "어제 일을 자세히 말하기",
      "koreanGoal": "어제 한 일을 장소, 시간, 이유와 함께 말합니다.",
      "grammar": {
        "id": "p2-pat-106-ayer-fui-a-porque",
        "name": "Ayer fui a... porque...",
        "koreanName": "과거 행동에 이유 붙이기",
        "anchorSpanish": "Ayer fui al centro porque necesitaba comprar medicina.",
        "anchorKorean": "어제 약을 사야 해서 시내에 갔어요."
      },
      "anchor": {
        "spanish": "Ayer fui al centro porque necesitaba comprar medicina.",
        "korean": "어제 약을 사야 해서 시내에 갔어요."
      },
      "vocabDomain": {
        "english": "past details",
        "korean": "어제, 장소, 이유, 필요",
        "tags": [
          "p2m02-stories-plans-history",
          "past-details",
          "day-106"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 일기 문장을 읽고 장소와 이유를 표시합니다.",
        "speakingKo": "어제 한 일을 세부 정보와 함께 말합니다.",
        "testKo": "과거 행동에 이유를 붙여 답합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d106-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d106-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Ayer fui a... porque...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d106-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 일기 문장을 읽고 장소와 이유를 표시합니다."
          },
          {
            "id": "p2-d106-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "어제 한 일을 세부 정보와 함께 말합니다."
          },
          {
            "id": "p2-d106-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 107,
      "phaseDay": 17,
      "week": 16,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Recent experience",
      "englishOutcome": "Talk about something you have done recently.",
      "koreanTitle": "최근 경험 말하기",
      "koreanGoal": "최근에 해 본 일을 말하고 간단한 느낌을 덧붙입니다.",
      "grammar": {
        "id": "p2-pat-107-esta-semana-he",
        "name": "Esta semana he...",
        "koreanName": "최근 경험 덩어리",
        "anchorSpanish": "Esta semana he hablado más español y me siento mejor.",
        "anchorKorean": "이번 주에 스페인어를 더 많이 말했고 기분이 나아졌어요."
      },
      "anchor": {
        "spanish": "Esta semana he hablado más español y me siento mejor.",
        "korean": "이번 주에 스페인어를 더 많이 말했고 기분이 나아졌어요."
      },
      "vocabDomain": {
        "english": "recent actions",
        "korean": "이번 주, 최근, 경험, 느낌",
        "tags": [
          "p2m02-stories-plans-history",
          "recent-actions",
          "day-107"
        ]
      },
      "focus": {
        "readingListeningKo": "최근 경험 메시지를 읽고 완료된 행동을 찾습니다.",
        "speakingKo": "이번 주에 한 일을 두 가지 말합니다.",
        "testKo": "최근 경험과 느낌을 연결합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d107-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d107-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Esta semana he...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d107-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "최근 경험 메시지를 읽고 완료된 행동을 찾습니다."
          },
          {
            "id": "p2-d107-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "이번 주에 한 일을 두 가지 말합니다."
          },
          {
            "id": "p2-d107-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 108,
      "phaseDay": 18,
      "week": 16,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Life timeline",
      "englishOutcome": "Describe your life path in simple stages.",
      "koreanTitle": "삶의 흐름 말하기",
      "koreanGoal": "태어난 곳, 산 곳, 배운 것, 지금 하는 일을 순서대로 말합니다.",
      "grammar": {
        "id": "p2-pat-108-naci-en-despues-vivi-en",
        "name": "Nací en... después viví en...",
        "koreanName": "개인사 순서",
        "anchorSpanish": "Nací en Corea, después viví en Seúl, y ahora estudio español.",
        "anchorKorean": "저는 한국에서 태어났고 그다음 서울에 살았고 지금은 스페인어를 공부해요."
      },
      "anchor": {
        "spanish": "Nací en Corea, después viví en Seúl, y ahora estudio español.",
        "korean": "저는 한국에서 태어났고 그다음 서울에 살았고 지금은 스페인어를 공부해요."
      },
      "vocabDomain": {
        "english": "life timeline",
        "korean": "태어나다, 살다, 공부하다, 지금",
        "tags": [
          "p2m02-stories-plans-history",
          "life-timeline",
          "day-108"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 자기소개 글에서 시간 흐름 표현을 봅니다.",
        "speakingKo": "내 삶의 흐름을 네 문장으로 말합니다.",
        "testKo": "개인사를 순서대로 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d108-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d108-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Nací en... después viví en...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d108-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 자기소개 글에서 시간 흐름 표현을 봅니다."
          },
          {
            "id": "p2-d108-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "내 삶의 흐름을 네 문장으로 말합니다."
          },
          {
            "id": "p2-d108-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 109,
      "phaseDay": 19,
      "week": 16,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Childhood and now",
      "englishOutcome": "Compare childhood habits with current habits.",
      "koreanTitle": "어릴 때와 지금 비교",
      "koreanGoal": "어릴 때 하던 일과 지금 하는 일을 비교합니다.",
      "grammar": {
        "id": "p2-pat-109-de-nino-nina-ahora",
        "name": "De niño/niña... ahora...",
        "koreanName": "과거와 현재 대조",
        "anchorSpanish": "De niña era tímida, pero ahora practico hablar con más confianza.",
        "anchorKorean": "어릴 때는 수줍었지만 지금은 더 자신 있게 말하는 연습을 해요."
      },
      "anchor": {
        "spanish": "De niña era tímida, pero ahora practico hablar con más confianza.",
        "korean": "어릴 때는 수줍었지만 지금은 더 자신 있게 말하는 연습을 해요."
      },
      "vocabDomain": {
        "english": "before and now",
        "korean": "어릴 때, 지금, 습관 변화",
        "tags": [
          "p2m02-stories-plans-history",
          "before-and-now",
          "day-109"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 회고문을 읽고 과거/현재 표현을 나눕니다.",
        "speakingKo": "어릴 때와 지금의 차이를 두 가지 말합니다.",
        "testKo": "과거 습관과 현재 습관을 비교합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d109-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d109-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'De niño/niña... ahora...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d109-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 회고문을 읽고 과거/현재 표현을 나눕니다."
          },
          {
            "id": "p2-d109-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "어릴 때와 지금의 차이를 두 가지 말합니다."
          },
          {
            "id": "p2-d109-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 110,
      "phaseDay": 20,
      "week": 16,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Plans for the weekend",
      "englishOutcome": "Make flexible plans and alternatives.",
      "koreanTitle": "주말 계획과 대안",
      "koreanGoal": "주말 계획을 말하고 비가 오거나 바쁘면 대안을 제시합니다.",
      "grammar": {
        "id": "p2-pat-110-si-puedo-si-no",
        "name": "Si puedo... si no...",
        "koreanName": "가능하면/아니면",
        "anchorSpanish": "Si puedo, voy al mercado; si no, cocino en casa.",
        "anchorKorean": "가능하면 시장에 가고, 아니면 집에서 요리해요."
      },
      "anchor": {
        "spanish": "Si puedo, voy al mercado; si no, cocino en casa.",
        "korean": "가능하면 시장에 가고, 아니면 집에서 요리해요."
      },
      "vocabDomain": {
        "english": "weekend plans",
        "korean": "계획, 대안, 가능성",
        "tags": [
          "p2m02-stories-plans-history",
          "weekend-plans",
          "day-110"
        ]
      },
      "focus": {
        "readingListeningKo": "주말 일정표를 읽고 조건별 계획을 정리합니다.",
        "speakingKo": "주말 계획과 대안을 말합니다.",
        "testKo": "조건이 바뀌어도 계획을 다시 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d110-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d110-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Si puedo... si no...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d110-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "주말 일정표를 읽고 조건별 계획을 정리합니다."
          },
          {
            "id": "p2-d110-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "주말 계획과 대안을 말합니다."
          },
          {
            "id": "p2-d110-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 111,
      "phaseDay": 21,
      "week": 16,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Future goals",
      "englishOutcome": "Explain a goal and the next small step.",
      "koreanTitle": "미래 목표와 다음 행동",
      "koreanGoal": "큰 목표를 말하고 다음 작은 행동을 구체화합니다.",
      "grammar": {
        "id": "p2-pat-111-mi-meta-es-entonces-voy-a",
        "name": "Mi meta es... entonces voy a...",
        "koreanName": "목표와 다음 단계",
        "anchorSpanish": "Mi meta es hablar con más confianza, entonces voy a practicar diez minutos más.",
        "anchorKorean": "제 목표는 더 자신 있게 말하는 것이고 그래서 10분 더 연습할 거예요."
      },
      "anchor": {
        "spanish": "Mi meta es hablar con más confianza, entonces voy a practicar diez minutos más.",
        "korean": "제 목표는 더 자신 있게 말하는 것이고 그래서 10분 더 연습할 거예요."
      },
      "vocabDomain": {
        "english": "goals and steps",
        "korean": "목표, 다음 행동, 기간",
        "tags": [
          "p2m02-stories-plans-history",
          "goals-and-steps",
          "day-111"
        ]
      },
      "focus": {
        "readingListeningKo": "학습 목표 글을 읽고 다음 행동을 찾습니다.",
        "speakingKo": "내 스페인어 목표와 오늘 할 일을 말합니다.",
        "testKo": "목표가 추상적이지 않게 다음 행동을 붙입니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d111-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d111-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Mi meta es... entonces voy a...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d111-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "학습 목표 글을 읽고 다음 행동을 찾습니다."
          },
          {
            "id": "p2-d111-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "내 스페인어 목표와 오늘 할 일을 말합니다."
          },
          {
            "id": "p2-d111-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 112,
      "phaseDay": 22,
      "week": 17,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Making predictions",
      "englishOutcome": "Make simple predictions about plans and outcomes.",
      "koreanTitle": "간단한 예측",
      "koreanGoal": "일정이나 결과에 대해 조심스럽게 예측합니다.",
      "grammar": {
        "id": "p2-pat-112-creo-que-va-a",
        "name": "Creo que va a...",
        "koreanName": "미래 예측",
        "anchorSpanish": "Creo que va a llover, entonces vamos a cambiar el plan.",
        "anchorKorean": "비가 올 것 같아서 계획을 바꿀 거예요."
      },
      "anchor": {
        "spanish": "Creo que va a llover, entonces vamos a cambiar el plan.",
        "korean": "비가 올 것 같아서 계획을 바꿀 거예요."
      },
      "vocabDomain": {
        "english": "predictions",
        "korean": "예상, 날씨, 일정 변경",
        "tags": [
          "p2m02-stories-plans-history",
          "predictions",
          "day-112"
        ]
      },
      "focus": {
        "readingListeningKo": "날씨와 일정 안내를 읽고 예측 표현을 봅니다.",
        "speakingKo": "예상되는 문제와 대안을 말합니다.",
        "testKo": "예측과 대응을 함께 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d112-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d112-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Creo que va a...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d112-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "날씨와 일정 안내를 읽고 예측 표현을 봅니다."
          },
          {
            "id": "p2-d112-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "예상되는 문제와 대안을 말합니다."
          },
          {
            "id": "p2-d112-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 113,
      "phaseDay": 23,
      "week": 17,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Inviting with context",
      "englishOutcome": "Invite someone and explain why.",
      "koreanTitle": "이유 있는 초대",
      "koreanGoal": "초대할 때 장소와 이유를 함께 말합니다.",
      "grammar": {
        "id": "p2-pat-113-te-invito-porque",
        "name": "Te invito porque...",
        "koreanName": "초대 이유 말하기",
        "anchorSpanish": "Te invito a cenar porque quiero practicar español contigo.",
        "anchorKorean": "당신과 스페인어를 연습하고 싶어서 저녁에 초대해요."
      },
      "anchor": {
        "spanish": "Te invito a cenar porque quiero practicar español contigo.",
        "korean": "당신과 스페인어를 연습하고 싶어서 저녁에 초대해요."
      },
      "vocabDomain": {
        "english": "invitations",
        "korean": "초대, 이유, 함께하기",
        "tags": [
          "p2m02-stories-plans-history",
          "invitations",
          "day-113"
        ]
      },
      "focus": {
        "readingListeningKo": "초대 메시지를 읽고 이유와 시간 표현을 표시합니다.",
        "speakingKo": "친구를 초대하고 이유를 덧붙입니다.",
        "testKo": "초대, 시간, 이유를 모두 포함합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d113-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d113-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Te invito porque...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d113-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "초대 메시지를 읽고 이유와 시간 표현을 표시합니다."
          },
          {
            "id": "p2-d113-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "친구를 초대하고 이유를 덧붙입니다."
          },
          {
            "id": "p2-d113-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 114,
      "phaseDay": 24,
      "week": 17,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Changing plans politely",
      "englishOutcome": "Change a plan without sounding rude.",
      "koreanTitle": "계획 변경을 공손하게 말하기",
      "koreanGoal": "계획을 바꾸어야 할 때 이유와 대안을 함께 말합니다.",
      "grammar": {
        "id": "p2-pat-114-perdon-necesito-cambiar",
        "name": "Perdón, necesito cambiar...",
        "koreanName": "계획 변경",
        "anchorSpanish": "Perdón, necesito cambiar la hora porque salgo tarde del trabajo.",
        "anchorKorean": "미안해요, 일이 늦게 끝나서 시간을 바꿔야 해요."
      },
      "anchor": {
        "spanish": "Perdón, necesito cambiar la hora porque salgo tarde del trabajo.",
        "korean": "미안해요, 일이 늦게 끝나서 시간을 바꿔야 해요."
      },
      "vocabDomain": {
        "english": "plan changes",
        "korean": "미안함, 이유, 대안 시간",
        "tags": [
          "p2m02-stories-plans-history",
          "plan-changes",
          "day-114"
        ]
      },
      "focus": {
        "readingListeningKo": "일정 변경 메시지를 읽고 공손한 완충 표현을 찾습니다.",
        "speakingKo": "약속 시간을 바꾸고 대안을 제안합니다.",
        "testKo": "상대가 불쾌하지 않게 변경을 요청합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d114-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d114-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Perdón, necesito cambiar...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d114-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "일정 변경 메시지를 읽고 공손한 완충 표현을 찾습니다."
          },
          {
            "id": "p2-d114-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "약속 시간을 바꾸고 대안을 제안합니다."
          },
          {
            "id": "p2-d114-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 115,
      "phaseDay": 25,
      "week": 17,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Story with problem and solution",
      "englishOutcome": "Tell a short story with a problem and solution.",
      "koreanTitle": "문제와 해결이 있는 이야기",
      "koreanGoal": "작은 문제와 해결 과정을 짧은 이야기로 말합니다.",
      "grammar": {
        "id": "p2-pat-115-tuve-un-problema-pero",
        "name": "Tuve un problema, pero...",
        "koreanName": "문제 후 해결",
        "anchorSpanish": "Tuve un problema con el taxi, pero al final llegué bien.",
        "anchorKorean": "택시 문제가 있었지만 결국 잘 도착했어요."
      },
      "anchor": {
        "spanish": "Tuve un problema con el taxi, pero al final llegué bien.",
        "korean": "택시 문제가 있었지만 결국 잘 도착했어요."
      },
      "vocabDomain": {
        "english": "problem stories",
        "korean": "문제, 하지만, 결국",
        "tags": [
          "p2m02-stories-plans-history",
          "problem-stories",
          "day-115"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 사건 이야기를 읽고 전환 표현을 봅니다.",
        "speakingKo": "문제와 해결을 포함한 경험을 말합니다.",
        "testKo": "결말까지 포함해 이야기를 마칩니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d115-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d115-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Tuve un problema, pero...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d115-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 사건 이야기를 읽고 전환 표현을 봅니다."
          },
          {
            "id": "p2-d115-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "문제와 해결을 포함한 경험을 말합니다."
          },
          {
            "id": "p2-d115-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 116,
      "phaseDay": 26,
      "week": 17,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Travel memories",
      "englishOutcome": "Share a travel memory simply.",
      "koreanTitle": "여행 기억 말하기",
      "koreanGoal": "여행에서 좋았던 것과 어려웠던 것을 함께 말합니다.",
      "grammar": {
        "id": "p2-pat-116-lo-mejor-fue-lo-dificil-fue",
        "name": "Lo mejor fue... lo difícil fue...",
        "koreanName": "좋았던 점과 어려웠던 점",
        "anchorSpanish": "Lo mejor fue la comida; lo difícil fue entender los anuncios.",
        "anchorKorean": "가장 좋았던 것은 음식이었고 어려웠던 것은 안내방송을 이해하는 것이었어요."
      },
      "anchor": {
        "spanish": "Lo mejor fue la comida; lo difícil fue entender los anuncios.",
        "korean": "가장 좋았던 것은 음식이었고 어려웠던 것은 안내방송을 이해하는 것이었어요."
      },
      "vocabDomain": {
        "english": "travel memories",
        "korean": "여행, 좋았던 점, 어려움",
        "tags": [
          "p2m02-stories-plans-history",
          "travel-memories",
          "day-116"
        ]
      },
      "focus": {
        "readingListeningKo": "여행 후기 문장을 읽고 평가 표현을 찾습니다.",
        "speakingKo": "여행 기억 하나를 좋았던 점/어려웠던 점으로 말합니다.",
        "testKo": "경험 평가를 균형 있게 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d116-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d116-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Lo mejor fue... lo difícil fue...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d116-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "여행 후기 문장을 읽고 평가 표현을 찾습니다."
          },
          {
            "id": "p2-d116-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "여행 기억 하나를 좋았던 점/어려웠던 점으로 말합니다."
          },
          {
            "id": "p2-d116-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 117,
      "phaseDay": 27,
      "week": 17,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Work and study history",
      "englishOutcome": "Explain your work or study background.",
      "koreanTitle": "일과 공부 이력",
      "koreanGoal": "전공, 일, 공부 경험을 부담 없는 수준으로 말합니다.",
      "grammar": {
        "id": "p2-pat-117-estudie-trabaje-en",
        "name": "Estudié... trabajé en...",
        "koreanName": "이력 말하기",
        "anchorSpanish": "Estudié diseño y trabajé en una oficina por dos años.",
        "anchorKorean": "디자인을 공부했고 사무실에서 2년 동안 일했어요."
      },
      "anchor": {
        "spanish": "Estudié diseño y trabajé en una oficina por dos años.",
        "korean": "디자인을 공부했고 사무실에서 2년 동안 일했어요."
      },
      "vocabDomain": {
        "english": "background",
        "korean": "전공, 회사, 기간, 역할",
        "tags": [
          "p2m02-stories-plans-history",
          "background",
          "day-117"
        ]
      },
      "focus": {
        "readingListeningKo": "간단한 프로필 글을 읽고 이력 표현을 표시합니다.",
        "speakingKo": "내 공부나 일 배경을 네 문장으로 말합니다.",
        "testKo": "기간과 역할을 포함해 이력을 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d117-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d117-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Estudié... trabajé en...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d117-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "간단한 프로필 글을 읽고 이력 표현을 표시합니다."
          },
          {
            "id": "p2-d117-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "내 공부나 일 배경을 네 문장으로 말합니다."
          },
          {
            "id": "p2-d117-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 118,
      "phaseDay": 28,
      "week": 17,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Explaining decisions",
      "englishOutcome": "Explain why you decided to do something.",
      "koreanTitle": "결정 이유 설명",
      "koreanGoal": "어떤 결정을 내린 이유를 짧게 설명합니다.",
      "grammar": {
        "id": "p2-pat-118-decidi-porque",
        "name": "Decidí... porque...",
        "koreanName": "결정과 이유",
        "anchorSpanish": "Decidí aprender español porque quiero viajar por América Latina.",
        "anchorKorean": "라틴아메리카를 여행하고 싶어서 스페인어를 배우기로 했어요."
      },
      "anchor": {
        "spanish": "Decidí aprender español porque quiero viajar por América Latina.",
        "korean": "라틴아메리카를 여행하고 싶어서 스페인어를 배우기로 했어요."
      },
      "vocabDomain": {
        "english": "decisions",
        "korean": "결정하다, 이유, 목표",
        "tags": [
          "p2m02-stories-plans-history",
          "decisions",
          "day-118"
        ]
      },
      "focus": {
        "readingListeningKo": "결정 이유가 있는 짧은 글을 읽고 구조를 봅니다.",
        "speakingKo": "내가 시작한 일과 그 이유를 말합니다.",
        "testKo": "결정과 이유를 한 흐름으로 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d118-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d118-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Decidí... porque...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d118-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "결정 이유가 있는 짧은 글을 읽고 구조를 봅니다."
          },
          {
            "id": "p2-d118-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "내가 시작한 일과 그 이유를 말합니다."
          },
          {
            "id": "p2-d118-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 119,
      "phaseDay": 29,
      "week": 18,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Narrative review",
      "englishOutcome": "Combine past, present, and future.",
      "koreanTitle": "과거-현재-미래 통합",
      "koreanGoal": "과거 경험, 현재 상태, 앞으로의 계획을 연결합니다.",
      "grammar": {
        "id": "p2-pat-119-antes-ahora-despues",
        "name": "Antes... ahora... después...",
        "koreanName": "시간 축 통합",
        "anchorSpanish": "Antes tenía miedo de hablar, ahora practico cada día, y después quiero viajar.",
        "anchorKorean": "예전에는 말하기가 두려웠고 지금은 매일 연습하고 나중에는 여행하고 싶어요."
      },
      "anchor": {
        "spanish": "Antes tenía miedo de hablar, ahora practico cada día, y después quiero viajar.",
        "korean": "예전에는 말하기가 두려웠고 지금은 매일 연습하고 나중에는 여행하고 싶어요."
      },
      "vocabDomain": {
        "english": "timeline review",
        "korean": "예전, 지금, 나중, 변화",
        "tags": [
          "p2m02-stories-plans-history",
          "timeline-review",
          "day-119"
        ]
      },
      "focus": {
        "readingListeningKo": "개인 변화 이야기를 읽고 시간 축을 표시합니다.",
        "speakingKo": "내 학습 변화를 과거-현재-미래로 말합니다.",
        "testKo": "시간 축이 분명한 1분 답변을 합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d119-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d119-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Antes... ahora... después...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d119-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "개인 변화 이야기를 읽고 시간 축을 표시합니다."
          },
          {
            "id": "p2-d119-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "내 학습 변화를 과거-현재-미래로 말합니다."
          },
          {
            "id": "p2-d119-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 120,
      "phaseDay": 30,
      "week": 18,
      "moduleId": "p2m02-stories-plans-history",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Speaking checkpoint 4",
      "englishOutcome": "Tell a personal story with plans and reasons.",
      "koreanTitle": "말하기 체크포인트 4",
      "koreanGoal": "개인사와 계획을 이유와 함께 3분 동안 말합니다.",
      "grammar": {
        "id": "p2-pat-120-esta-es-mi-historia-en-espanol",
        "name": "Esta es mi historia en español.",
        "koreanName": "개인 이야기 발표",
        "anchorSpanish": "Esta es mi historia en español: empecé con frases simples y ahora puedo contar más.",
        "anchorKorean": "이것이 제 스페인어 이야기예요. 간단한 표현으로 시작했고 이제 더 많이 이야기할 수 있어요."
      },
      "anchor": {
        "spanish": "Esta es mi historia en español: empecé con frases simples y ahora puedo contar más.",
        "korean": "이것이 제 스페인어 이야기예요. 간단한 표현으로 시작했고 이제 더 많이 이야기할 수 있어요."
      },
      "vocabDomain": {
        "english": "story checkpoint",
        "korean": "개인사, 계획, 이유, 자신감",
        "tags": [
          "p2m02-stories-plans-history",
          "story-checkpoint",
          "day-120"
        ]
      },
      "focus": {
        "readingListeningKo": "체크포인트 평가표를 읽고 시간 흐름과 이유 항목을 확인합니다.",
        "speakingKo": "개인 이야기, 목표, 다음 행동을 말합니다.",
        "testKo": "3분 개인 이야기에서 과거/현재/미래를 모두 사용합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d120-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d120-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Esta es mi historia en español.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d120-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "체크포인트 평가표를 읽고 시간 흐름과 이유 항목을 확인합니다."
          },
          {
            "id": "p2-d120-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "개인 이야기, 목표, 다음 행동을 말합니다."
          },
          {
            "id": "p2-d120-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 121,
      "phaseDay": 31,
      "week": 18,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Stronger preferences",
      "englishOutcome": "Explain what you prefer and why.",
      "koreanTitle": "선호를 더 정확히 말하기",
      "koreanGoal": "둘 중 무엇을 더 좋아하는지 이유와 함께 말합니다.",
      "grammar": {
        "id": "p2-pat-121-prefiero-porque",
        "name": "Prefiero... porque...",
        "koreanName": "선호와 이유",
        "anchorSpanish": "Prefiero caminar porque puedo conocer mejor la ciudad.",
        "anchorKorean": "도시를 더 잘 알 수 있어서 걷는 것을 더 좋아해요."
      },
      "anchor": {
        "spanish": "Prefiero caminar porque puedo conocer mejor la ciudad.",
        "korean": "도시를 더 잘 알 수 있어서 걷는 것을 더 좋아해요."
      },
      "vocabDomain": {
        "english": "preferences",
        "korean": "선호, 비교, 이유",
        "tags": [
          "p2m03-opinions-relationships",
          "preferences",
          "day-121"
        ]
      },
      "focus": {
        "readingListeningKo": "리뷰 문장에서 선호와 이유를 찾습니다.",
        "speakingKo": "두 선택지를 비교하고 선호를 말합니다.",
        "testKo": "선호와 이유를 분명하게 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d121-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d121-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Prefiero... porque...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d121-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "리뷰 문장에서 선호와 이유를 찾습니다."
          },
          {
            "id": "p2-d121-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "두 선택지를 비교하고 선호를 말합니다."
          },
          {
            "id": "p2-d121-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 122,
      "phaseDay": 32,
      "week": 18,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Likes with conditions",
      "englishOutcome": "Say when you like or do not like something.",
      "koreanTitle": "조건이 있는 취향",
      "koreanGoal": "상황에 따라 달라지는 취향을 말합니다.",
      "grammar": {
        "id": "p2-pat-122-me-gusta-cuando",
        "name": "Me gusta... cuando...",
        "koreanName": "조건부 취향",
        "anchorSpanish": "Me gusta salir cuando no hace mucho calor.",
        "anchorKorean": "너무 덥지 않을 때 외출하는 것을 좋아해요."
      },
      "anchor": {
        "spanish": "Me gusta salir cuando no hace mucho calor.",
        "korean": "너무 덥지 않을 때 외출하는 것을 좋아해요."
      },
      "vocabDomain": {
        "english": "conditional likes",
        "korean": "상황, 날씨, 기분, 조건",
        "tags": [
          "p2m03-opinions-relationships",
          "conditional-likes",
          "day-122"
        ]
      },
      "focus": {
        "readingListeningKo": "취향 인터뷰를 읽고 조건 표현을 표시합니다.",
        "speakingKo": "내 취향이 언제 달라지는지 말합니다.",
        "testKo": "조건을 붙여 취향을 설명합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d122-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d122-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Me gusta... cuando...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d122-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "취향 인터뷰를 읽고 조건 표현을 표시합니다."
          },
          {
            "id": "p2-d122-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "내 취향이 언제 달라지는지 말합니다."
          },
          {
            "id": "p2-d122-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 123,
      "phaseDay": 33,
      "week": 18,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Giving recommendations",
      "englishOutcome": "Recommend a place, food, or routine.",
      "koreanTitle": "추천하기",
      "koreanGoal": "장소나 음식, 습관을 이유와 함께 추천합니다.",
      "grammar": {
        "id": "p2-pat-123-te-recomiendo-porque",
        "name": "Te recomiendo... porque...",
        "koreanName": "추천과 이유",
        "anchorSpanish": "Te recomiendo este café porque es tranquilo y barato.",
        "anchorKorean": "조용하고 저렴해서 이 카페를 추천해요."
      },
      "anchor": {
        "spanish": "Te recomiendo este café porque es tranquilo y barato.",
        "korean": "조용하고 저렴해서 이 카페를 추천해요."
      },
      "vocabDomain": {
        "english": "recommendations",
        "korean": "추천, 장점, 이유",
        "tags": [
          "p2m03-opinions-relationships",
          "recommendations",
          "day-123"
        ]
      },
      "focus": {
        "readingListeningKo": "추천 글을 읽고 장점 표현을 정리합니다.",
        "speakingKo": "친구에게 장소 하나를 추천합니다.",
        "testKo": "추천 이유를 두 가지 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d123-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d123-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Te recomiendo... porque...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d123-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "추천 글을 읽고 장점 표현을 정리합니다."
          },
          {
            "id": "p2-d123-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "친구에게 장소 하나를 추천합니다."
          },
          {
            "id": "p2-d123-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 124,
      "phaseDay": 34,
      "week": 18,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Agreeing with nuance",
      "englishOutcome": "Agree while adding your own view.",
      "koreanTitle": "뉘앙스 있게 동의하기",
      "koreanGoal": "그냥 네라고 하지 않고 내 생각을 덧붙입니다.",
      "grammar": {
        "id": "p2-pat-124-estoy-de-acuerdo-pero-tambien",
        "name": "Estoy de acuerdo, pero también...",
        "koreanName": "동의 후 덧붙이기",
        "anchorSpanish": "Estoy de acuerdo, pero también creo que necesitamos más tiempo.",
        "anchorKorean": "동의하지만 우리에게 시간이 더 필요하다고도 생각해요."
      },
      "anchor": {
        "spanish": "Estoy de acuerdo, pero también creo que necesitamos más tiempo.",
        "korean": "동의하지만 우리에게 시간이 더 필요하다고도 생각해요."
      },
      "vocabDomain": {
        "english": "agreement",
        "korean": "동의, 추가 의견, 균형",
        "tags": [
          "p2m03-opinions-relationships",
          "agreement",
          "day-124"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 토론문을 읽고 동의와 추가 의견을 구분합니다.",
        "speakingKo": "상대 의견에 동의한 뒤 내 생각을 하나 더 말합니다.",
        "testKo": "동의와 추가 의견을 함께 표현합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d124-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d124-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Estoy de acuerdo, pero también...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d124-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 토론문을 읽고 동의와 추가 의견을 구분합니다."
          },
          {
            "id": "p2-d124-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "상대 의견에 동의한 뒤 내 생각을 하나 더 말합니다."
          },
          {
            "id": "p2-d124-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 125,
      "phaseDay": 35,
      "week": 18,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Polite disagreement",
      "englishOutcome": "Disagree without closing the conversation.",
      "koreanTitle": "공손한 반대",
      "koreanGoal": "상대 의견을 인정하면서 부드럽게 다른 생각을 말합니다.",
      "grammar": {
        "id": "p2-pat-125-entiendo-tu-punto-pero",
        "name": "Entiendo tu punto, pero...",
        "koreanName": "상대 의견 인정 후 반대",
        "anchorSpanish": "Entiendo tu punto, pero para mí es mejor salir temprano.",
        "anchorKorean": "무슨 말인지 이해하지만 제게는 일찍 나가는 게 더 좋아요."
      },
      "anchor": {
        "spanish": "Entiendo tu punto, pero para mí es mejor salir temprano.",
        "korean": "무슨 말인지 이해하지만 제게는 일찍 나가는 게 더 좋아요."
      },
      "vocabDomain": {
        "english": "disagreement",
        "korean": "인정, 반대, 대안",
        "tags": [
          "p2m03-opinions-relationships",
          "disagreement",
          "day-125"
        ]
      },
      "focus": {
        "readingListeningKo": "의견 차이 대화를 읽고 완충 표현을 표시합니다.",
        "speakingKo": "상대 의견에 공손히 반대하고 대안을 말합니다.",
        "testKo": "반대해도 대화를 이어갑니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d125-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d125-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Entiendo tu punto, pero...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d125-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "의견 차이 대화를 읽고 완충 표현을 표시합니다."
          },
          {
            "id": "p2-d125-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "상대 의견에 공손히 반대하고 대안을 말합니다."
          },
          {
            "id": "p2-d125-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 126,
      "phaseDay": 36,
      "week": 19,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Explaining relationships",
      "englishOutcome": "Describe how you know someone and your relationship.",
      "koreanTitle": "관계 설명하기",
      "koreanGoal": "누구와 어떻게 아는 사이인지 간단히 설명합니다.",
      "grammar": {
        "id": "p2-pat-126-nos-conocemos-porque",
        "name": "Nos conocemos porque...",
        "koreanName": "관계의 배경",
        "anchorSpanish": "Nos conocemos porque estudiamos juntos hace años.",
        "anchorKorean": "우리는 몇 년 전에 같이 공부해서 아는 사이예요."
      },
      "anchor": {
        "spanish": "Nos conocemos porque estudiamos juntos hace años.",
        "korean": "우리는 몇 년 전에 같이 공부해서 아는 사이예요."
      },
      "vocabDomain": {
        "english": "relationships",
        "korean": "친구, 동료, 가족, 알게 되다",
        "tags": [
          "p2m03-opinions-relationships",
          "relationships",
          "day-126"
        ]
      },
      "focus": {
        "readingListeningKo": "사람 소개 문장을 읽고 관계 표현을 봅니다.",
        "speakingKo": "친구나 동료 한 명을 소개합니다.",
        "testKo": "관계와 알게 된 배경을 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d126-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d126-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Nos conocemos porque...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d126-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "사람 소개 문장을 읽고 관계 표현을 봅니다."
          },
          {
            "id": "p2-d126-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "친구나 동료 한 명을 소개합니다."
          },
          {
            "id": "p2-d126-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 127,
      "phaseDay": 37,
      "week": 19,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Describing personality",
      "englishOutcome": "Describe personality with examples.",
      "koreanTitle": "성격을 예시로 설명",
      "koreanGoal": "성격 형용사를 예시 행동과 연결합니다.",
      "grammar": {
        "id": "p2-pat-127-es-una-persona-siempre",
        "name": "Es una persona... siempre...",
        "koreanName": "성격과 예시",
        "anchorSpanish": "Es una persona muy amable; siempre ayuda a los demás.",
        "anchorKorean": "그 사람은 매우 친절해요. 항상 다른 사람들을 도와줘요."
      },
      "anchor": {
        "spanish": "Es una persona muy amable; siempre ayuda a los demás.",
        "korean": "그 사람은 매우 친절해요. 항상 다른 사람들을 도와줘요."
      },
      "vocabDomain": {
        "english": "personality",
        "korean": "친절함, 조용함, 활발함, 예시",
        "tags": [
          "p2m03-opinions-relationships",
          "personality",
          "day-127"
        ]
      },
      "focus": {
        "readingListeningKo": "인물 소개 글을 읽고 성격과 행동을 연결합니다.",
        "speakingKo": "아는 사람의 성격을 예시와 함께 말합니다.",
        "testKo": "성격 표현이 추상적으로 끝나지 않게 예시를 붙입니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d127-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d127-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Es una persona... siempre...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d127-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "인물 소개 글을 읽고 성격과 행동을 연결합니다."
          },
          {
            "id": "p2-d127-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "아는 사람의 성격을 예시와 함께 말합니다."
          },
          {
            "id": "p2-d127-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 128,
      "phaseDay": 38,
      "week": 19,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Boundaries and comfort",
      "englishOutcome": "Say what is okay or not okay for you.",
      "koreanTitle": "괜찮은 것과 불편한 것",
      "koreanGoal": "내가 편한 것과 불편한 것을 정중하게 말합니다.",
      "grammar": {
        "id": "p2-pat-128-para-mi-esta-bien-pero-no",
        "name": "Para mí está bien..., pero no...",
        "koreanName": "경계와 편안함",
        "anchorSpanish": "Para mí está bien hablar despacio, pero no entiendo si hablan muy rápido.",
        "anchorKorean": "천천히 말하는 것은 괜찮지만 너무 빨리 말하면 이해하지 못해요."
      },
      "anchor": {
        "spanish": "Para mí está bien hablar despacio, pero no entiendo si hablan muy rápido.",
        "korean": "천천히 말하는 것은 괜찮지만 너무 빨리 말하면 이해하지 못해요."
      },
      "vocabDomain": {
        "english": "boundaries",
        "korean": "괜찮다, 어렵다, 천천히",
        "tags": [
          "p2m03-opinions-relationships",
          "boundaries",
          "day-128"
        ]
      },
      "focus": {
        "readingListeningKo": "수업 규칙 문장을 읽고 편안함 표현을 찾습니다.",
        "speakingKo": "내가 언어 연습에서 편한 방식과 어려운 방식을 말합니다.",
        "testKo": "부담을 줄이는 요청을 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d128-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d128-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Para mí está bien..., pero no...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d128-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "수업 규칙 문장을 읽고 편안함 표현을 찾습니다."
          },
          {
            "id": "p2-d128-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "내가 언어 연습에서 편한 방식과 어려운 방식을 말합니다."
          },
          {
            "id": "p2-d128-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 129,
      "phaseDay": 39,
      "week": 19,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Apologizing and explaining",
      "englishOutcome": "Apologize briefly and explain what happened.",
      "koreanTitle": "사과와 설명",
      "koreanGoal": "미안함을 표현하고 핑계처럼 들리지 않게 이유를 말합니다.",
      "grammar": {
        "id": "p2-pat-129-perdon-por-es-que",
        "name": "Perdón por... es que...",
        "koreanName": "사과 후 설명",
        "anchorSpanish": "Perdón por llegar tarde; es que hubo mucho tráfico.",
        "anchorKorean": "늦어서 죄송해요. 교통이 너무 막혔어요."
      },
      "anchor": {
        "spanish": "Perdón por llegar tarde; es que hubo mucho tráfico.",
        "korean": "늦어서 죄송해요. 교통이 너무 막혔어요."
      },
      "vocabDomain": {
        "english": "apologies",
        "korean": "사과, 이유, 늦음, 실수",
        "tags": [
          "p2m03-opinions-relationships",
          "apologies",
          "day-129"
        ]
      },
      "focus": {
        "readingListeningKo": "사과 메시지를 읽고 이유 표현을 표시합니다.",
        "speakingKo": "늦거나 실수한 상황을 사과하고 설명합니다.",
        "testKo": "사과, 이유, 다음 행동을 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d129-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d129-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Perdón por... es que...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d129-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "사과 메시지를 읽고 이유 표현을 표시합니다."
          },
          {
            "id": "p2-d129-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "늦거나 실수한 상황을 사과하고 설명합니다."
          },
          {
            "id": "p2-d129-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 130,
      "phaseDay": 40,
      "week": 19,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Compliments and responses",
      "englishOutcome": "Give and receive compliments naturally.",
      "koreanTitle": "칭찬과 반응",
      "koreanGoal": "칭찬하고 부담 없이 받아들이는 표현을 씁니다.",
      "grammar": {
        "id": "p2-pat-130-que-bonito-gracias-que-amable",
        "name": "Qué bonito... gracias, qué amable.",
        "koreanName": "칭찬과 감사",
        "anchorSpanish": "Qué bonito tu español. Gracias, qué amable; todavía estoy aprendiendo.",
        "anchorKorean": "스페인어가 좋네요. 감사합니다, 친절하시네요. 아직 배우는 중이에요."
      },
      "anchor": {
        "spanish": "Qué bonito tu español. Gracias, qué amable; todavía estoy aprendiendo.",
        "korean": "스페인어가 좋네요. 감사합니다, 친절하시네요. 아직 배우는 중이에요."
      },
      "vocabDomain": {
        "english": "compliments",
        "korean": "칭찬, 감사, 겸손한 반응",
        "tags": [
          "p2m03-opinions-relationships",
          "compliments",
          "day-130"
        ]
      },
      "focus": {
        "readingListeningKo": "칭찬 대화를 읽고 자연스러운 반응을 봅니다.",
        "speakingKo": "상대의 물건이나 노력에 대해 칭찬합니다.",
        "testKo": "칭찬을 받았을 때 부정하지 않고 감사로 받습니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d130-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d130-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Qué bonito... gracias, qué amable.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d130-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "칭찬 대화를 읽고 자연스러운 반응을 봅니다."
          },
          {
            "id": "p2-d130-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "상대의 물건이나 노력에 대해 칭찬합니다."
          },
          {
            "id": "p2-d130-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 131,
      "phaseDay": 41,
      "week": 19,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Negotiating preferences",
      "englishOutcome": "Find a shared option when preferences differ.",
      "koreanTitle": "취향 조율하기",
      "koreanGoal": "서로 원하는 것이 다를 때 중간 선택지를 찾습니다.",
      "grammar": {
        "id": "p2-pat-131-que-te-parece-si",
        "name": "¿Qué te parece si...?",
        "koreanName": "대안 제안",
        "anchorSpanish": "¿Qué te parece si comemos algo ligero y después tomamos café?",
        "anchorKorean": "가볍게 먹고 그다음 커피 마시는 건 어때요?"
      },
      "anchor": {
        "spanish": "¿Qué te parece si comemos algo ligero y después tomamos café?",
        "korean": "가볍게 먹고 그다음 커피 마시는 건 어때요?"
      },
      "vocabDomain": {
        "english": "negotiation",
        "korean": "대안, 중간 선택, 제안",
        "tags": [
          "p2m03-opinions-relationships",
          "negotiation",
          "day-131"
        ]
      },
      "focus": {
        "readingListeningKo": "약속 조율 대화를 읽고 제안 표현을 찾습니다.",
        "speakingKo": "서로 다른 취향을 듣고 중간 제안을 합니다.",
        "testKo": "갈등 없이 선택지를 조율합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d131-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d131-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'¿Qué te parece si...?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d131-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "약속 조율 대화를 읽고 제안 표현을 찾습니다."
          },
          {
            "id": "p2-d131-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "서로 다른 취향을 듣고 중간 제안을 합니다."
          },
          {
            "id": "p2-d131-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 132,
      "phaseDay": 42,
      "week": 19,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Explaining values",
      "englishOutcome": "Say what is important to you.",
      "koreanTitle": "나에게 중요한 것",
      "koreanGoal": "내 가치나 우선순위를 쉬운 문장으로 말합니다.",
      "grammar": {
        "id": "p2-pat-132-para-mi-es-importante",
        "name": "Para mí es importante...",
        "koreanName": "중요성 표현",
        "anchorSpanish": "Para mí es importante aprender sin miedo y practicar con personas reales.",
        "anchorKorean": "저에게는 두려움 없이 배우고 실제 사람들과 연습하는 것이 중요해요."
      },
      "anchor": {
        "spanish": "Para mí es importante aprender sin miedo y practicar con personas reales.",
        "korean": "저에게는 두려움 없이 배우고 실제 사람들과 연습하는 것이 중요해요."
      },
      "vocabDomain": {
        "english": "values",
        "korean": "중요하다, 우선순위, 이유",
        "tags": [
          "p2m03-opinions-relationships",
          "values",
          "day-132"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 자기소개 글에서 가치 표현을 표시합니다.",
        "speakingKo": "나에게 중요한 학습 조건을 말합니다.",
        "testKo": "중요한 것과 이유를 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d132-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d132-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Para mí es importante...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d132-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 자기소개 글에서 가치 표현을 표시합니다."
          },
          {
            "id": "p2-d132-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "나에게 중요한 학습 조건을 말합니다."
          },
          {
            "id": "p2-d132-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 133,
      "phaseDay": 43,
      "week": 20,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Mini debate prep",
      "englishOutcome": "Prepare a simple two-reason opinion.",
      "koreanTitle": "미니 토론 준비",
      "koreanGoal": "하나의 의견을 두 가지 이유로 방어합니다.",
      "grammar": {
        "id": "p2-pat-133-mi-opinion-es-primero-segundo",
        "name": "Mi opinión es... primero... segundo...",
        "koreanName": "의견 구조화",
        "anchorSpanish": "Mi opinión es que hablar cada día ayuda: primero da confianza, segundo crea hábito.",
        "anchorKorean": "제 의견은 매일 말하는 것이 도움이 된다는 거예요. 첫째 자신감을 주고, 둘째 습관을 만들어요."
      },
      "anchor": {
        "spanish": "Mi opinión es que hablar cada día ayuda: primero da confianza, segundo crea hábito.",
        "korean": "제 의견은 매일 말하는 것이 도움이 된다는 거예요. 첫째 자신감을 주고, 둘째 습관을 만들어요."
      },
      "vocabDomain": {
        "english": "debate prep",
        "korean": "의견, 첫째, 둘째, 근거",
        "tags": [
          "p2m03-opinions-relationships",
          "debate-prep",
          "day-133"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 의견문을 읽고 두 이유를 표시합니다.",
        "speakingKo": "간단한 주제에 대해 두 이유를 말합니다.",
        "testKo": "의견과 두 가지 이유를 1분 안에 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d133-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d133-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Mi opinión es... primero... segundo...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d133-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 의견문을 읽고 두 이유를 표시합니다."
          },
          {
            "id": "p2-d133-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "간단한 주제에 대해 두 이유를 말합니다."
          },
          {
            "id": "p2-d133-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 134,
      "phaseDay": 44,
      "week": 20,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Relationship review role-play",
      "englishOutcome": "Combine opinions, relationships, and disagreement.",
      "koreanTitle": "관계와 의견 통합 역할극",
      "koreanGoal": "친구와 계획을 조율하며 의견 차이를 부드럽게 해결합니다.",
      "grammar": {
        "id": "p2-pat-134-podemos-buscar-una-opcion-que-funcio",
        "name": "Podemos buscar una opción que funcione para los dos.",
        "koreanName": "둘 다 괜찮은 선택지",
        "anchorSpanish": "Podemos buscar una opción que funcione para los dos.",
        "anchorKorean": "우리 둘 다에게 괜찮은 선택지를 찾아볼 수 있어요."
      },
      "anchor": {
        "spanish": "Podemos buscar una opción que funcione para los dos.",
        "korean": "우리 둘 다에게 괜찮은 선택지를 찾아볼 수 있어요."
      },
      "vocabDomain": {
        "english": "relationship review",
        "korean": "조율, 반대, 추천, 가치",
        "tags": [
          "p2m03-opinions-relationships",
          "relationship-review",
          "day-134"
        ]
      },
      "focus": {
        "readingListeningKo": "친구끼리 계획을 바꾸는 대화를 읽고 흐름을 봅니다.",
        "speakingKo": "역할극에서 추천, 반대, 대안을 모두 사용합니다.",
        "testKo": "관계를 해치지 않고 의견을 조율합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d134-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d134-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Podemos buscar una opción que funcione para los dos.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d134-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "친구끼리 계획을 바꾸는 대화를 읽고 흐름을 봅니다."
          },
          {
            "id": "p2-d134-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "역할극에서 추천, 반대, 대안을 모두 사용합니다."
          },
          {
            "id": "p2-d134-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 135,
      "phaseDay": 45,
      "week": 20,
      "moduleId": "p2m03-opinions-relationships",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Speaking checkpoint 5",
      "englishOutcome": "Handle a polite disagreement and reach a plan.",
      "koreanTitle": "말하기 체크포인트 5",
      "koreanGoal": "의견 차이가 있는 상황에서 계획을 합의합니다.",
      "grammar": {
        "id": "p2-pat-135-no-pensamos-igual-pero-podemos-habla",
        "name": "No pensamos igual, pero podemos hablarlo.",
        "koreanName": "다른 의견을 대화로 풀기",
        "anchorSpanish": "No pensamos igual, pero podemos hablarlo y decidir juntos.",
        "anchorKorean": "생각이 같지는 않지만 이야기하고 함께 결정할 수 있어요."
      },
      "anchor": {
        "spanish": "No pensamos igual, pero podemos hablarlo y decidir juntos.",
        "korean": "생각이 같지는 않지만 이야기하고 함께 결정할 수 있어요."
      },
      "vocabDomain": {
        "english": "opinion checkpoint",
        "korean": "반대, 이유, 대안, 합의",
        "tags": [
          "p2m03-opinions-relationships",
          "opinion-checkpoint",
          "day-135"
        ]
      },
      "focus": {
        "readingListeningKo": "체크포인트 지시문을 읽고 합의 조건을 확인합니다.",
        "speakingKo": "의견 차이 역할극에서 합의까지 갑니다.",
        "testKo": "공손한 반대와 대안 제시를 평가합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d135-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d135-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'No pensamos igual, pero podemos hablarlo.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d135-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "체크포인트 지시문을 읽고 합의 조건을 확인합니다."
          },
          {
            "id": "p2-d135-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "의견 차이 역할극에서 합의까지 갑니다."
          },
          {
            "id": "p2-d135-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 136,
      "phaseDay": 46,
      "week": 20,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Service complaint basics",
      "englishOutcome": "Explain what is not working and request a fix.",
      "koreanTitle": "서비스 문제 제기",
      "koreanGoal": "작동하지 않는 점을 설명하고 수리를 요청합니다.",
      "grammar": {
        "id": "p2-pat-136-no-funciona-pueden-revisarlo",
        "name": "No funciona... ¿pueden revisarlo?",
        "koreanName": "작동 문제와 점검 요청",
        "anchorSpanish": "No funciona el agua caliente. ¿Pueden revisarlo hoy?",
        "anchorKorean": "온수가 나오지 않아요. 오늘 확인해 주실 수 있나요?"
      },
      "anchor": {
        "spanish": "No funciona el agua caliente. ¿Pueden revisarlo hoy?",
        "korean": "온수가 나오지 않아요. 오늘 확인해 주실 수 있나요?"
      },
      "vocabDomain": {
        "english": "service issues",
        "korean": "작동, 점검, 오늘, 수리",
        "tags": [
          "p2m04-services-admin-problems",
          "service-issues",
          "day-136"
        ]
      },
      "focus": {
        "readingListeningKo": "서비스 신고 양식 예시를 읽고 문제 표현을 찾습니다.",
        "speakingKo": "집이나 서비스 문제를 설명하고 점검을 요청합니다.",
        "testKo": "문제와 원하는 조치를 명확히 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d136-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d136-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'No funciona... ¿pueden revisarlo?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d136-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "서비스 신고 양식 예시를 읽고 문제 표현을 찾습니다."
          },
          {
            "id": "p2-d136-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "집이나 서비스 문제를 설명하고 점검을 요청합니다."
          },
          {
            "id": "p2-d136-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 137,
      "phaseDay": 47,
      "week": 20,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Scheduling a visit",
      "englishOutcome": "Schedule, confirm, and adjust an appointment window.",
      "koreanTitle": "방문 일정 잡기",
      "koreanGoal": "기사 방문 시간을 잡고 가능한 시간대를 확인합니다.",
      "grammar": {
        "id": "p2-pat-137-a-que-hora-pueden-venir",
        "name": "¿A qué hora pueden venir?",
        "koreanName": "방문 시간 확인",
        "anchorSpanish": "¿A qué hora pueden venir? Estoy disponible después de las tres.",
        "anchorKorean": "몇 시에 오실 수 있나요? 저는 세 시 이후에 가능합니다."
      },
      "anchor": {
        "spanish": "¿A qué hora pueden venir? Estoy disponible después de las tres.",
        "korean": "몇 시에 오실 수 있나요? 저는 세 시 이후에 가능합니다."
      },
      "vocabDomain": {
        "english": "appointments",
        "korean": "방문, 가능 시간, 확인",
        "tags": [
          "p2m04-services-admin-problems",
          "appointments",
          "day-137"
        ]
      },
      "focus": {
        "readingListeningKo": "일정 조율 메시지를 읽고 가능한 시간대를 표시합니다.",
        "speakingKo": "방문 가능 시간을 말하고 다시 확인합니다.",
        "testKo": "시간대를 정확히 조율합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d137-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d137-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'¿A qué hora pueden venir?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d137-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "일정 조율 메시지를 읽고 가능한 시간대를 표시합니다."
          },
          {
            "id": "p2-d137-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "방문 가능 시간을 말하고 다시 확인합니다."
          },
          {
            "id": "p2-d137-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 138,
      "phaseDay": 48,
      "week": 20,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Housing rules",
      "englishOutcome": "Ask about rules and responsibilities.",
      "koreanTitle": "주거 규칙 묻기",
      "koreanGoal": "계약 전 규칙, 보증금, 책임 범위를 묻습니다.",
      "grammar": {
        "id": "p2-pat-138-que-incluye-la-renta",
        "name": "¿Qué incluye la renta?",
        "koreanName": "월세 포함 사항",
        "anchorSpanish": "¿Qué incluye la renta y quién paga el internet?",
        "anchorKorean": "월세에는 무엇이 포함되고 인터넷은 누가 내나요?"
      },
      "anchor": {
        "spanish": "¿Qué incluye la renta y quién paga el internet?",
        "korean": "월세에는 무엇이 포함되고 인터넷은 누가 내나요?"
      },
      "vocabDomain": {
        "english": "housing rules",
        "korean": "월세, 보증금, 포함, 규칙",
        "tags": [
          "p2m04-services-admin-problems",
          "housing-rules",
          "day-138"
        ]
      },
      "focus": {
        "readingListeningKo": "임대 광고를 읽고 포함 사항을 확인합니다.",
        "speakingKo": "집 조건에 대해 세 가지 질문을 합니다.",
        "testKo": "계약 전 확인 질문을 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d138-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d138-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'¿Qué incluye la renta?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d138-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "임대 광고를 읽고 포함 사항을 확인합니다."
          },
          {
            "id": "p2-d138-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "집 조건에 대해 세 가지 질문을 합니다."
          },
          {
            "id": "p2-d138-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 139,
      "phaseDay": 49,
      "week": 20,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Reporting damage",
      "englishOutcome": "Report damage with location and urgency.",
      "koreanTitle": "파손 신고",
      "koreanGoal": "어디가 어떻게 고장났는지와 급한 정도를 말합니다.",
      "grammar": {
        "id": "p2-pat-139-se-rompio-en",
        "name": "Se rompió... en...",
        "koreanName": "파손 위치 설명",
        "anchorSpanish": "Se rompió la ventana de la cocina y entra mucho ruido.",
        "anchorKorean": "부엌 창문이 깨져서 소음이 많이 들어와요."
      },
      "anchor": {
        "spanish": "Se rompió la ventana de la cocina y entra mucho ruido.",
        "korean": "부엌 창문이 깨져서 소음이 많이 들어와요."
      },
      "vocabDomain": {
        "english": "damage report",
        "korean": "깨지다, 위치, 소음, 위험",
        "tags": [
          "p2m04-services-admin-problems",
          "damage-report",
          "day-139"
        ]
      },
      "focus": {
        "readingListeningKo": "파손 신고 메시지를 읽고 위치와 상태를 표시합니다.",
        "speakingKo": "파손된 물건을 위치와 함께 설명합니다.",
        "testKo": "긴급도까지 포함해 신고합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d139-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d139-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Se rompió... en...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d139-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "파손 신고 메시지를 읽고 위치와 상태를 표시합니다."
          },
          {
            "id": "p2-d139-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "파손된 물건을 위치와 함께 설명합니다."
          },
          {
            "id": "p2-d139-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 140,
      "phaseDay": 50,
      "week": 21,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Medical history basics",
      "englishOutcome": "Explain simple medical history and allergies.",
      "koreanTitle": "기본 병력과 알레르기",
      "koreanGoal": "알레르기, 복용 약, 과거 증상을 간단히 말합니다.",
      "grammar": {
        "id": "p2-pat-140-soy-alergico-alergica-a",
        "name": "Soy alérgico/alérgica a...",
        "koreanName": "알레르기 말하기",
        "anchorSpanish": "Soy alérgica a la penicilina y tomo medicina para la presión.",
        "anchorKorean": "페니실린 알레르기가 있고 혈압약을 먹어요."
      },
      "anchor": {
        "spanish": "Soy alérgica a la penicilina y tomo medicina para la presión.",
        "korean": "페니실린 알레르기가 있고 혈압약을 먹어요."
      },
      "vocabDomain": {
        "english": "medical history",
        "korean": "알레르기, 약, 혈압, 병력",
        "tags": [
          "p2m04-services-admin-problems",
          "medical-history",
          "day-140"
        ]
      },
      "focus": {
        "readingListeningKo": "진료 문진표 문장을 읽고 건강 정보를 표시합니다.",
        "speakingKo": "알레르기와 복용 중인 약을 말합니다.",
        "testKo": "의료진에게 안전 정보를 전달합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d140-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d140-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Soy alérgico/alérgica a...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d140-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "진료 문진표 문장을 읽고 건강 정보를 표시합니다."
          },
          {
            "id": "p2-d140-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "알레르기와 복용 중인 약을 말합니다."
          },
          {
            "id": "p2-d140-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 141,
      "phaseDay": 51,
      "week": 21,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Describing symptoms over time",
      "englishOutcome": "Describe symptom duration and change.",
      "koreanTitle": "증상 변화 설명",
      "koreanGoal": "증상이 언제 시작했고 좋아졌는지 나빠졌는지 말합니다.",
      "grammar": {
        "id": "p2-pat-141-empezo-hace-y-ahora",
        "name": "Empezó hace... y ahora...",
        "koreanName": "증상 기간과 변화",
        "anchorSpanish": "Empezó hace tres días y ahora me duele más.",
        "anchorKorean": "3일 전에 시작됐고 지금은 더 아파요."
      },
      "anchor": {
        "spanish": "Empezó hace tres días y ahora me duele más.",
        "korean": "3일 전에 시작됐고 지금은 더 아파요."
      },
      "vocabDomain": {
        "english": "symptom timeline",
        "korean": "시작, 기간, 변화, 더 아픔",
        "tags": [
          "p2m04-services-admin-problems",
          "symptom-timeline",
          "day-141"
        ]
      },
      "focus": {
        "readingListeningKo": "증상 기록을 읽고 시간 표현을 표시합니다.",
        "speakingKo": "증상 하나를 기간과 변화로 설명합니다.",
        "testKo": "의사가 묻는 기간 질문에 답합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d141-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d141-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Empezó hace... y ahora...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d141-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "증상 기록을 읽고 시간 표현을 표시합니다."
          },
          {
            "id": "p2-d141-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "증상 하나를 기간과 변화로 설명합니다."
          },
          {
            "id": "p2-d141-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 142,
      "phaseDay": 52,
      "week": 21,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "At the pharmacy with constraints",
      "englishOutcome": "Ask for medicine while mentioning limits.",
      "koreanTitle": "조건이 있는 약국 요청",
      "koreanGoal": "졸리지 않는 약, 알레르기, 복용법 같은 조건을 말합니다.",
      "grammar": {
        "id": "p2-pat-142-necesito-algo-que-no-me-de-sueno",
        "name": "Necesito algo que no me dé sueño.",
        "koreanName": "졸리지 않는 약 요청",
        "anchorSpanish": "Necesito algo para la tos que no me dé sueño.",
        "anchorKorean": "졸리지 않는 기침약이 필요해요."
      },
      "anchor": {
        "spanish": "Necesito algo para la tos que no me dé sueño.",
        "korean": "졸리지 않는 기침약이 필요해요."
      },
      "vocabDomain": {
        "english": "pharmacy constraints",
        "korean": "기침, 졸림, 알레르기, 복용법",
        "tags": [
          "p2m04-services-admin-problems",
          "pharmacy-constraints",
          "day-142"
        ]
      },
      "focus": {
        "readingListeningKo": "약국 안내 문장을 읽고 주의사항을 봅니다.",
        "speakingKo": "증상과 조건을 함께 말해 약을 요청합니다.",
        "testKo": "조건을 빠뜨리지 않고 약을 요청합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d142-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d142-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Necesito algo que no me dé sueño.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d142-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "약국 안내 문장을 읽고 주의사항을 봅니다."
          },
          {
            "id": "p2-d142-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "증상과 조건을 함께 말해 약을 요청합니다."
          },
          {
            "id": "p2-d142-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 143,
      "phaseDay": 53,
      "week": 21,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Bank issue escalation",
      "englishOutcome": "Explain a transaction issue clearly.",
      "koreanTitle": "은행 문제 설명",
      "koreanGoal": "카드, 이체, 인출 문제를 거래 정보와 함께 설명합니다.",
      "grammar": {
        "id": "p2-pat-143-hice-una-transferencia-pero",
        "name": "Hice una transferencia, pero...",
        "koreanName": "거래 문제",
        "anchorSpanish": "Hice una transferencia, pero todavía no aparece en mi cuenta.",
        "anchorKorean": "이체를 했지만 아직 제 계좌에 보이지 않아요."
      },
      "anchor": {
        "spanish": "Hice una transferencia, pero todavía no aparece en mi cuenta.",
        "korean": "이체를 했지만 아직 제 계좌에 보이지 않아요."
      },
      "vocabDomain": {
        "english": "bank issues",
        "korean": "이체, 계좌, 카드, 아직",
        "tags": [
          "p2m04-services-admin-problems",
          "bank-issues",
          "day-143"
        ]
      },
      "focus": {
        "readingListeningKo": "은행 알림 메시지를 읽고 문제 상황을 파악합니다.",
        "speakingKo": "거래 문제와 확인 요청을 말합니다.",
        "testKo": "은행 직원에게 필요한 정보를 전달합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d143-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d143-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Hice una transferencia, pero...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d143-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "은행 알림 메시지를 읽고 문제 상황을 파악합니다."
          },
          {
            "id": "p2-d143-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "거래 문제와 확인 요청을 말합니다."
          },
          {
            "id": "p2-d143-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 144,
      "phaseDay": 54,
      "week": 21,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Documents and copies",
      "englishOutcome": "Ask what documents are needed and in what format.",
      "koreanTitle": "서류와 사본 확인",
      "koreanGoal": "필요한 서류와 원본/사본 여부를 묻습니다.",
      "grammar": {
        "id": "p2-pat-144-necesito-original-o-copia",
        "name": "¿Necesito original o copia?",
        "koreanName": "원본/사본 묻기",
        "anchorSpanish": "¿Necesito original o copia de mi identificación?",
        "anchorKorean": "신분증 원본이 필요한가요, 사본이 필요한가요?"
      },
      "anchor": {
        "spanish": "¿Necesito original o copia de mi identificación?",
        "korean": "신분증 원본이 필요한가요, 사본이 필요한가요?"
      },
      "vocabDomain": {
        "english": "documents",
        "korean": "신분증, 원본, 사본, 서명",
        "tags": [
          "p2m04-services-admin-problems",
          "documents",
          "day-144"
        ]
      },
      "focus": {
        "readingListeningKo": "행정 안내문을 읽고 요구 서류를 표시합니다.",
        "speakingKo": "서류 절차에서 필요한 것을 묻습니다.",
        "testKo": "원본/사본/서명 여부를 확인합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d144-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d144-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'¿Necesito original o copia?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d144-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "행정 안내문을 읽고 요구 서류를 표시합니다."
          },
          {
            "id": "p2-d144-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "서류 절차에서 필요한 것을 묻습니다."
          },
          {
            "id": "p2-d144-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 145,
      "phaseDay": 55,
      "week": 21,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Filling forms",
      "englishOutcome": "Ask how to fill a confusing form field.",
      "koreanTitle": "양식 작성 질문",
      "koreanGoal": "양식에서 헷갈리는 항목을 구체적으로 묻습니다.",
      "grammar": {
        "id": "p2-pat-145-que-pongo-en-esta-parte",
        "name": "¿Qué pongo en esta parte?",
        "koreanName": "양식 항목 질문",
        "anchorSpanish": "¿Qué pongo en esta parte si no tengo segundo apellido?",
        "anchorKorean": "두 번째 성이 없으면 이 부분에 무엇을 쓰나요?"
      },
      "anchor": {
        "spanish": "¿Qué pongo en esta parte si no tengo segundo apellido?",
        "korean": "두 번째 성이 없으면 이 부분에 무엇을 쓰나요?"
      },
      "vocabDomain": {
        "english": "forms",
        "korean": "항목, 성, 주소, 서명",
        "tags": [
          "p2m04-services-admin-problems",
          "forms",
          "day-145"
        ]
      },
      "focus": {
        "readingListeningKo": "간단한 양식 예시를 읽고 질문을 만듭니다.",
        "speakingKo": "헷갈리는 양식 항목을 가리키며 질문합니다.",
        "testKo": "모르는 항목을 그냥 넘기지 않고 확인합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d145-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d145-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'¿Qué pongo en esta parte?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d145-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "간단한 양식 예시를 읽고 질문을 만듭니다."
          },
          {
            "id": "p2-d145-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "헷갈리는 양식 항목을 가리키며 질문합니다."
          },
          {
            "id": "p2-d145-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 146,
      "phaseDay": 56,
      "week": 21,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Lost item report",
      "englishOutcome": "Report a lost item with details.",
      "koreanTitle": "분실물 신고",
      "koreanGoal": "잃어버린 물건의 장소, 시간, 특징을 설명합니다.",
      "grammar": {
        "id": "p2-pat-146-perdi-tiene",
        "name": "Perdí... tiene...",
        "koreanName": "분실물 특징 설명",
        "anchorSpanish": "Perdí mi cartera en el metro; es negra y tiene mi identificación.",
        "anchorKorean": "지하철에서 지갑을 잃어버렸어요. 검은색이고 신분증이 들어 있어요."
      },
      "anchor": {
        "spanish": "Perdí mi cartera en el metro; es negra y tiene mi identificación.",
        "korean": "지하철에서 지갑을 잃어버렸어요. 검은색이고 신분증이 들어 있어요."
      },
      "vocabDomain": {
        "english": "lost item",
        "korean": "분실, 특징, 장소, 시간",
        "tags": [
          "p2m04-services-admin-problems",
          "lost-item",
          "day-146"
        ]
      },
      "focus": {
        "readingListeningKo": "분실물 신고 예문을 읽고 특징 정보를 찾습니다.",
        "speakingKo": "분실물을 장소와 특징으로 설명합니다.",
        "testKo": "분실물 신고에 필요한 세부 정보를 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d146-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d146-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Perdí... tiene...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d146-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "분실물 신고 예문을 읽고 특징 정보를 찾습니다."
          },
          {
            "id": "p2-d146-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "분실물을 장소와 특징으로 설명합니다."
          },
          {
            "id": "p2-d146-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 147,
      "phaseDay": 57,
      "week": 22,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Delay and compensation",
      "englishOutcome": "Ask about delays, refunds, or compensation.",
      "koreanTitle": "지연과 환불 문의",
      "koreanGoal": "지연 상황에서 환불이나 대안을 공손히 묻습니다.",
      "grammar": {
        "id": "p2-pat-147-hay-reembolso-o-cambio",
        "name": "¿Hay reembolso o cambio?",
        "koreanName": "환불/변경 문의",
        "anchorSpanish": "Mi autobús salió tarde. ¿Hay reembolso o cambio de boleto?",
        "anchorKorean": "버스가 늦게 출발했어요. 환불이나 표 변경이 있나요?"
      },
      "anchor": {
        "spanish": "Mi autobús salió tarde. ¿Hay reembolso o cambio de boleto?",
        "korean": "버스가 늦게 출발했어요. 환불이나 표 변경이 있나요?"
      },
      "vocabDomain": {
        "english": "delays",
        "korean": "지연, 환불, 변경, 표",
        "tags": [
          "p2m04-services-admin-problems",
          "delays",
          "day-147"
        ]
      },
      "focus": {
        "readingListeningKo": "교통 안내문을 읽고 환불 조건을 찾습니다.",
        "speakingKo": "지연 상황을 설명하고 선택지를 묻습니다.",
        "testKo": "감정적으로 따지지 않고 조건을 확인합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d147-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d147-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'¿Hay reembolso o cambio?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d147-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "교통 안내문을 읽고 환불 조건을 찾습니다."
          },
          {
            "id": "p2-d147-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "지연 상황을 설명하고 선택지를 묻습니다."
          },
          {
            "id": "p2-d147-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 148,
      "phaseDay": 58,
      "week": 22,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Emergency but calm",
      "englishOutcome": "Ask for urgent help while staying clear.",
      "koreanTitle": "침착한 긴급 요청",
      "koreanGoal": "긴급한 상황에서도 위치와 필요한 도움을 정확히 말합니다.",
      "grammar": {
        "id": "p2-pat-148-es-urgente-necesito-ayuda-en",
        "name": "Es urgente. Necesito ayuda en...",
        "koreanName": "긴급함과 위치",
        "anchorSpanish": "Es urgente. Necesito ayuda en la entrada del edificio.",
        "anchorKorean": "긴급해요. 건물 입구에서 도움이 필요해요."
      },
      "anchor": {
        "spanish": "Es urgente. Necesito ayuda en la entrada del edificio.",
        "korean": "긴급해요. 건물 입구에서 도움이 필요해요."
      },
      "vocabDomain": {
        "english": "urgent help",
        "korean": "긴급, 위치, 도움, 안전",
        "tags": [
          "p2m04-services-admin-problems",
          "urgent-help",
          "day-148"
        ]
      },
      "focus": {
        "readingListeningKo": "긴급 신고 문장을 읽고 핵심 정보 순서를 봅니다.",
        "speakingKo": "긴급 상황에서 위치와 도움 요청을 말합니다.",
        "testKo": "짧고 명확하게 도움을 요청합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d148-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d148-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Es urgente. Necesito ayuda en...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d148-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "긴급 신고 문장을 읽고 핵심 정보 순서를 봅니다."
          },
          {
            "id": "p2-d148-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "긴급 상황에서 위치와 도움 요청을 말합니다."
          },
          {
            "id": "p2-d148-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 149,
      "phaseDay": 59,
      "week": 22,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Problem-solving review",
      "englishOutcome": "Combine service, health, admin, and lost-item language.",
      "koreanTitle": "생활 문제 해결 복습",
      "koreanGoal": "여러 생활 문제 상황을 문제-배경-요청 구조로 해결합니다.",
      "grammar": {
        "id": "p2-pat-149-el-problema-es-necesito-que-puedo-ha",
        "name": "El problema es..., necesito..., ¿qué puedo hacer?",
        "koreanName": "문제 해결 공식",
        "anchorSpanish": "El problema es que perdí mi tarjeta; necesito pagar. ¿Qué puedo hacer?",
        "anchorKorean": "문제는 카드를 잃어버렸고 결제해야 한다는 거예요. 어떻게 하면 될까요?"
      },
      "anchor": {
        "spanish": "El problema es que perdí mi tarjeta; necesito pagar. ¿Qué puedo hacer?",
        "korean": "문제는 카드를 잃어버렸고 결제해야 한다는 거예요. 어떻게 하면 될까요?"
      },
      "vocabDomain": {
        "english": "problem review",
        "korean": "문제, 필요, 선택지, 다음 단계",
        "tags": [
          "p2m04-services-admin-problems",
          "problem-review",
          "day-149"
        ]
      },
      "focus": {
        "readingListeningKo": "복합 문제 역할극 지시문을 읽고 필요한 정보를 정리합니다.",
        "speakingKo": "무작위 생활 문제를 세 문장 구조로 설명합니다.",
        "testKo": "문제, 필요, 다음 질문을 모두 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d149-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d149-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'El problema es..., necesito..., ¿qué puedo hacer?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d149-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "복합 문제 역할극 지시문을 읽고 필요한 정보를 정리합니다."
          },
          {
            "id": "p2-d149-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "무작위 생활 문제를 세 문장 구조로 설명합니다."
          },
          {
            "id": "p2-d149-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 150,
      "phaseDay": 60,
      "week": 22,
      "moduleId": "p2m04-services-admin-problems",
      "canonicalStatus": "planned",
      "cefrTarget": "A2",
      "englishTheme": "Speaking checkpoint 6",
      "englishOutcome": "Handle a real-life service problem from start to finish.",
      "koreanTitle": "말하기 체크포인트 6",
      "koreanGoal": "서비스 문제를 접수하고 일정까지 잡는 역할극을 합니다.",
      "grammar": {
        "id": "p2-pat-150-quiero-resolver-esto-hoy-si-es-posib",
        "name": "Quiero resolver esto hoy si es posible.",
        "koreanName": "오늘 해결하고 싶음",
        "anchorSpanish": "Quiero resolver esto hoy si es posible. ¿Cuál es el siguiente paso?",
        "anchorKorean": "가능하다면 오늘 이것을 해결하고 싶어요. 다음 단계가 무엇인가요?"
      },
      "anchor": {
        "spanish": "Quiero resolver esto hoy si es posible. ¿Cuál es el siguiente paso?",
        "korean": "가능하다면 오늘 이것을 해결하고 싶어요. 다음 단계가 무엇인가요?"
      },
      "vocabDomain": {
        "english": "service checkpoint",
        "korean": "접수, 설명, 일정, 다음 단계",
        "tags": [
          "p2m04-services-admin-problems",
          "service-checkpoint",
          "day-150"
        ]
      },
      "focus": {
        "readingListeningKo": "체크포인트 평가 기준에서 필수 정보 네 가지를 확인합니다.",
        "speakingKo": "문제 접수부터 다음 단계 확인까지 말합니다.",
        "testKo": "실제 생활 문제 해결 능력을 평가합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d150-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d150-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Quiero resolver esto hoy si es posible.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d150-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "체크포인트 평가 기준에서 필수 정보 네 가지를 확인합니다."
          },
          {
            "id": "p2-d150-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "문제 접수부터 다음 단계 확인까지 말합니다."
          },
          {
            "id": "p2-d150-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 151,
      "phaseDay": 61,
      "week": 22,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Reading signs",
      "englishOutcome": "Extract instructions from signs and notices.",
      "koreanTitle": "표지판 읽기",
      "koreanGoal": "금지, 안내, 시간 정보를 빠르게 찾아 이해합니다.",
      "grammar": {
        "id": "p2-pat-151-el-letrero-dice-que",
        "name": "El letrero dice que...",
        "koreanName": "표지판 내용 전달",
        "anchorSpanish": "El letrero dice que no se puede entrar después de las seis.",
        "anchorKorean": "표지판에는 여섯 시 이후에 들어갈 수 없다고 쓰여 있어요."
      },
      "anchor": {
        "spanish": "El letrero dice que no se puede entrar después de las seis.",
        "korean": "표지판에는 여섯 시 이후에 들어갈 수 없다고 쓰여 있어요."
      },
      "vocabDomain": {
        "english": "signs",
        "korean": "금지, 안내, 시간, 입장",
        "tags": [
          "p2m05-real-world-input",
          "signs",
          "day-151"
        ]
      },
      "focus": {
        "readingListeningKo": "표지판과 공지문에서 행동 지시를 찾습니다.",
        "speakingKo": "읽은 안내를 다른 사람에게 쉽게 설명합니다.",
        "testKo": "핵심 지시와 시간을 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d151-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d151-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'El letrero dice que...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d151-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "표지판과 공지문에서 행동 지시를 찾습니다."
          },
          {
            "id": "p2-d151-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "읽은 안내를 다른 사람에게 쉽게 설명합니다."
          },
          {
            "id": "p2-d151-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 152,
      "phaseDay": 62,
      "week": 22,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Reading menus faster",
      "englishOutcome": "Read a menu and ask one useful question.",
      "koreanTitle": "메뉴 빠르게 읽기",
      "koreanGoal": "메뉴에서 재료, 가격, 옵션을 찾아 질문합니다.",
      "grammar": {
        "id": "p2-pat-152-este-platillo-lleva",
        "name": "¿Este platillo lleva...?",
        "koreanName": "재료 확인",
        "anchorSpanish": "¿Este platillo lleva chile o puedo pedirlo sin chile?",
        "anchorKorean": "이 음식에 고추가 들어가나요, 아니면 빼고 주문할 수 있나요?"
      },
      "anchor": {
        "spanish": "¿Este platillo lleva chile o puedo pedirlo sin chile?",
        "korean": "이 음식에 고추가 들어가나요, 아니면 빼고 주문할 수 있나요?"
      },
      "vocabDomain": {
        "english": "menus",
        "korean": "재료, 가격, 매운맛, 옵션",
        "tags": [
          "p2m05-real-world-input",
          "menus",
          "day-152"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 메뉴를 읽고 선택 가능한 옵션을 표시합니다.",
        "speakingKo": "메뉴를 보고 재료나 맵기 질문을 합니다.",
        "testKo": "원하는 조건에 맞게 메뉴를 고릅니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d152-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d152-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'¿Este platillo lleva...?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d152-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 메뉴를 읽고 선택 가능한 옵션을 표시합니다."
          },
          {
            "id": "p2-d152-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "메뉴를 보고 재료나 맵기 질문을 합니다."
          },
          {
            "id": "p2-d152-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 153,
      "phaseDay": 63,
      "week": 22,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Reading transit updates",
      "englishOutcome": "Understand changes in transit messages.",
      "koreanTitle": "교통 변경 안내 읽기",
      "koreanGoal": "지연, 변경, 플랫폼 정보를 찾아 이동 계획을 조정합니다.",
      "grammar": {
        "id": "p2-pat-153-el-mensaje-dice-que-cambio",
        "name": "El mensaje dice que cambió...",
        "koreanName": "변경 안내 전달",
        "anchorSpanish": "El mensaje dice que cambió la puerta de salida.",
        "anchorKorean": "메시지에는 출발 게이트가 바뀌었다고 쓰여 있어요."
      },
      "anchor": {
        "spanish": "El mensaje dice que cambió la puerta de salida.",
        "korean": "메시지에는 출발 게이트가 바뀌었다고 쓰여 있어요."
      },
      "vocabDomain": {
        "english": "transit updates",
        "korean": "지연, 변경, 플랫폼, 출발",
        "tags": [
          "p2m05-real-world-input",
          "transit-updates",
          "day-153"
        ]
      },
      "focus": {
        "readingListeningKo": "교통 알림에서 바뀐 정보를 찾아봅니다.",
        "speakingKo": "변경된 정보를 동행자에게 설명합니다.",
        "testKo": "변경 사항과 다음 행동을 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d153-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d153-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'El mensaje dice que cambió...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d153-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "교통 알림에서 바뀐 정보를 찾아봅니다."
          },
          {
            "id": "p2-d153-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "변경된 정보를 동행자에게 설명합니다."
          },
          {
            "id": "p2-d153-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 154,
      "phaseDay": 64,
      "week": 23,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Voice message gist",
      "englishOutcome": "Catch the main point of a short voice message.",
      "koreanTitle": "음성 메시지 핵심 듣기",
      "koreanGoal": "짧은 음성 메시지에서 목적과 시간만 먼저 잡습니다.",
      "grammar": {
        "id": "p2-pat-154-el-mensaje-es-para",
        "name": "El mensaje es para...",
        "koreanName": "메시지 목적 말하기",
        "anchorSpanish": "El mensaje es para confirmar la cita de mañana a las diez.",
        "anchorKorean": "메시지는 내일 열 시 예약을 확인하려는 거예요."
      },
      "anchor": {
        "spanish": "El mensaje es para confirmar la cita de mañana a las diez.",
        "korean": "메시지는 내일 열 시 예약을 확인하려는 거예요."
      },
      "vocabDomain": {
        "english": "voice messages",
        "korean": "확인, 약속, 시간, 목적",
        "tags": [
          "p2m05-real-world-input",
          "voice-messages",
          "day-154"
        ]
      },
      "focus": {
        "readingListeningKo": "음성 메시지 스크립트를 읽고 핵심 정보를 표시합니다.",
        "speakingKo": "들은 메시지의 목적과 시간을 말합니다.",
        "testKo": "세부 단어를 몰라도 핵심을 요약합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d154-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d154-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'El mensaje es para...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d154-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "음성 메시지 스크립트를 읽고 핵심 정보를 표시합니다."
          },
          {
            "id": "p2-d154-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "들은 메시지의 목적과 시간을 말합니다."
          },
          {
            "id": "p2-d154-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 155,
      "phaseDay": 65,
      "week": 23,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Announcements",
      "englishOutcome": "Understand common public announcements.",
      "koreanTitle": "안내 방송 이해",
      "koreanGoal": "탑승, 지연, 대기, 변경 같은 안내 방송의 핵심을 잡습니다.",
      "grammar": {
        "id": "p2-pat-155-anunciaron-que",
        "name": "Anunciaron que...",
        "koreanName": "방송 내용 전달",
        "anchorSpanish": "Anunciaron que el vuelo está retrasado treinta minutos.",
        "anchorKorean": "비행기가 30분 지연됐다고 방송했어요."
      },
      "anchor": {
        "spanish": "Anunciaron que el vuelo está retrasado treinta minutos.",
        "korean": "비행기가 30분 지연됐다고 방송했어요."
      },
      "vocabDomain": {
        "english": "announcements",
        "korean": "방송, 지연, 탑승, 대기",
        "tags": [
          "p2m05-real-world-input",
          "announcements",
          "day-155"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 안내 방송 문장을 읽고 숫자와 행동을 표시합니다.",
        "speakingKo": "들은 방송을 한 문장으로 전달합니다.",
        "testKo": "방송의 시간과 행동 지시를 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d155-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d155-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Anunciaron que...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d155-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 안내 방송 문장을 읽고 숫자와 행동을 표시합니다."
          },
          {
            "id": "p2-d155-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "들은 방송을 한 문장으로 전달합니다."
          },
          {
            "id": "p2-d155-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 156,
      "phaseDay": 66,
      "week": 23,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Reading reviews",
      "englishOutcome": "Use reviews to make a decision.",
      "koreanTitle": "리뷰 읽고 결정하기",
      "koreanGoal": "장점과 단점을 읽고 선택 이유를 말합니다.",
      "grammar": {
        "id": "p2-pat-156-segun-las-resenas",
        "name": "Según las reseñas...",
        "koreanName": "리뷰에 따르면",
        "anchorSpanish": "Según las reseñas, el lugar es limpio pero un poco caro.",
        "anchorKorean": "리뷰에 따르면 그곳은 깨끗하지만 조금 비싸요."
      },
      "anchor": {
        "spanish": "Según las reseñas, el lugar es limpio pero un poco caro.",
        "korean": "리뷰에 따르면 그곳은 깨끗하지만 조금 비싸요."
      },
      "vocabDomain": {
        "english": "reviews",
        "korean": "리뷰, 장점, 단점, 결정",
        "tags": [
          "p2m05-real-world-input",
          "reviews",
          "day-156"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 리뷰 세 개를 읽고 공통 의견을 찾습니다.",
        "speakingKo": "리뷰를 바탕으로 갈지 말지 결정합니다.",
        "testKo": "리뷰 근거를 들어 선택합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d156-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d156-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Según las reseñas...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d156-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 리뷰 세 개를 읽고 공통 의견을 찾습니다."
          },
          {
            "id": "p2-d156-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "리뷰를 바탕으로 갈지 말지 결정합니다."
          },
          {
            "id": "p2-d156-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 157,
      "phaseDay": 67,
      "week": 23,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Reading instructions",
      "englishOutcome": "Follow simple written instructions.",
      "koreanTitle": "사용 설명 읽기",
      "koreanGoal": "짧은 절차를 읽고 순서대로 행동을 말합니다.",
      "grammar": {
        "id": "p2-pat-157-primero-hay-que",
        "name": "Primero hay que...",
        "koreanName": "절차 설명",
        "anchorSpanish": "Primero hay que registrarse y después confirmar el correo.",
        "anchorKorean": "먼저 등록하고 그다음 이메일을 확인해야 해요."
      },
      "anchor": {
        "spanish": "Primero hay que registrarse y después confirmar el correo.",
        "korean": "먼저 등록하고 그다음 이메일을 확인해야 해요."
      },
      "vocabDomain": {
        "english": "instructions",
        "korean": "먼저, 다음, 확인, 등록",
        "tags": [
          "p2m05-real-world-input",
          "instructions",
          "day-157"
        ]
      },
      "focus": {
        "readingListeningKo": "앱/기계 사용 안내를 읽고 순서를 표시합니다.",
        "speakingKo": "읽은 절차를 친구에게 설명합니다.",
        "testKo": "순서를 틀리지 않고 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d157-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d157-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Primero hay que...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d157-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "앱/기계 사용 안내를 읽고 순서를 표시합니다."
          },
          {
            "id": "p2-d157-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "읽은 절차를 친구에게 설명합니다."
          },
          {
            "id": "p2-d157-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 158,
      "phaseDay": 68,
      "week": 23,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Comparing two texts",
      "englishOutcome": "Compare two short options from written information.",
      "koreanTitle": "두 정보 비교하기",
      "koreanGoal": "두 선택지의 가격, 시간, 조건을 비교합니다.",
      "grammar": {
        "id": "p2-pat-158-esta-opcion-es-mas-pero",
        "name": "Esta opción es más..., pero...",
        "koreanName": "비교 후 양보",
        "anchorSpanish": "Esta opción es más barata, pero tarda más tiempo.",
        "anchorKorean": "이 선택지는 더 저렴하지만 시간이 더 오래 걸려요."
      },
      "anchor": {
        "spanish": "Esta opción es más barata, pero tarda más tiempo.",
        "korean": "이 선택지는 더 저렴하지만 시간이 더 오래 걸려요."
      },
      "vocabDomain": {
        "english": "comparison input",
        "korean": "가격, 시간, 조건, 양보",
        "tags": [
          "p2m05-real-world-input",
          "comparison-input",
          "day-158"
        ]
      },
      "focus": {
        "readingListeningKo": "두 광고나 일정표를 읽고 차이를 표시합니다.",
        "speakingKo": "두 선택지를 비교하고 추천합니다.",
        "testKo": "장단점을 함께 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d158-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d158-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Esta opción es más..., pero...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d158-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "두 광고나 일정표를 읽고 차이를 표시합니다."
          },
          {
            "id": "p2-d158-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "두 선택지를 비교하고 추천합니다."
          },
          {
            "id": "p2-d158-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 159,
      "phaseDay": 69,
      "week": 23,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Message thread reading",
      "englishOutcome": "Follow a short chat thread.",
      "koreanTitle": "채팅 흐름 읽기",
      "koreanGoal": "메시지 흐름에서 누가 무엇을 원하는지 파악합니다.",
      "grammar": {
        "id": "p2-pat-159-en-el-chat-ella-pregunta-si",
        "name": "En el chat, ella pregunta si...",
        "koreanName": "채팅 내용 요약",
        "anchorSpanish": "En el chat, ella pregunta si podemos cambiar la hora.",
        "anchorKorean": "채팅에서 그녀는 우리가 시간을 바꿀 수 있는지 묻고 있어요."
      },
      "anchor": {
        "spanish": "En el chat, ella pregunta si podemos cambiar la hora.",
        "korean": "채팅에서 그녀는 우리가 시간을 바꿀 수 있는지 묻고 있어요."
      },
      "vocabDomain": {
        "english": "chat threads",
        "korean": "누가, 무엇을, 시간 변경, 확인",
        "tags": [
          "p2m05-real-world-input",
          "chat-threads",
          "day-159"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 채팅을 읽고 요청과 답변을 표시합니다.",
        "speakingKo": "채팅 내용을 제삼자에게 요약합니다.",
        "testKo": "요청과 결정 사항을 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d159-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d159-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'En el chat, ella pregunta si...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d159-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 채팅을 읽고 요청과 답변을 표시합니다."
          },
          {
            "id": "p2-d159-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "채팅 내용을 제삼자에게 요약합니다."
          },
          {
            "id": "p2-d159-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 160,
      "phaseDay": 70,
      "week": 23,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Listening for numbers",
      "englishOutcome": "Catch numbers, prices, times, and addresses.",
      "koreanTitle": "숫자 집중 듣기",
      "koreanGoal": "가격, 시간, 전화번호, 주소를 놓치지 않게 듣습니다.",
      "grammar": {
        "id": "p2-pat-160-escuche-que-cuesta",
        "name": "Escuché que cuesta...",
        "koreanName": "들은 숫자 말하기",
        "anchorSpanish": "Escuché que cuesta ciento veinte pesos y sale a las nueve.",
        "anchorKorean": "120페소이고 아홉 시에 출발한다고 들었어요."
      },
      "anchor": {
        "spanish": "Escuché que cuesta ciento veinte pesos y sale a las nueve.",
        "korean": "120페소이고 아홉 시에 출발한다고 들었어요."
      },
      "vocabDomain": {
        "english": "number listening",
        "korean": "가격, 시간, 주소, 번호",
        "tags": [
          "p2m05-real-world-input",
          "number-listening",
          "day-160"
        ]
      },
      "focus": {
        "readingListeningKo": "숫자가 있는 안내문을 읽고 단위와 숫자를 연결합니다.",
        "speakingKo": "들은 숫자를 다시 확인하는 질문을 합니다.",
        "testKo": "숫자 정보를 정확히 반복합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d160-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d160-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Escuché que cuesta...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d160-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "숫자가 있는 안내문을 읽고 단위와 숫자를 연결합니다."
          },
          {
            "id": "p2-d160-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "들은 숫자를 다시 확인하는 질문을 합니다."
          },
          {
            "id": "p2-d160-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 161,
      "phaseDay": 71,
      "week": 24,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Listening for emotion",
      "englishOutcome": "Notice tone and emotion in simple messages.",
      "koreanTitle": "감정 듣기",
      "koreanGoal": "상대가 화났는지, 급한지, 기쁜지 간단히 파악합니다.",
      "grammar": {
        "id": "p2-pat-161-parece-que-esta",
        "name": "Parece que está...",
        "koreanName": "상태 추측",
        "anchorSpanish": "Parece que está preocupado porque necesita una respuesta hoy.",
        "anchorKorean": "오늘 답이 필요해서 걱정하는 것 같아요."
      },
      "anchor": {
        "spanish": "Parece que está preocupado porque necesita una respuesta hoy.",
        "korean": "오늘 답이 필요해서 걱정하는 것 같아요."
      },
      "vocabDomain": {
        "english": "emotion listening",
        "korean": "걱정, 급함, 기쁨, 피곤함",
        "tags": [
          "p2m05-real-world-input",
          "emotion-listening",
          "day-161"
        ]
      },
      "focus": {
        "readingListeningKo": "감정이 드러나는 메시지를 읽고 이유를 찾습니다.",
        "speakingKo": "상대의 감정을 추측하고 부드럽게 반응합니다.",
        "testKo": "감정과 이유를 함께 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d161-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d161-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Parece que está...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d161-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "감정이 드러나는 메시지를 읽고 이유를 찾습니다."
          },
          {
            "id": "p2-d161-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "상대의 감정을 추측하고 부드럽게 반응합니다."
          },
          {
            "id": "p2-d161-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 162,
      "phaseDay": 72,
      "week": 24,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Input to speaking",
      "englishOutcome": "Turn a short text into a spoken response.",
      "koreanTitle": "읽은 내용을 말로 바꾸기",
      "koreanGoal": "읽은 정보를 내 말로 바꾸어 대답합니다.",
      "grammar": {
        "id": "p2-pat-162-entonces-voy-a",
        "name": "Entonces voy a...",
        "koreanName": "읽고 행동 말하기",
        "anchorSpanish": "Entonces voy a llegar antes de las ocho y llevar mi identificación.",
        "anchorKorean": "그러면 여덟 시 전에 도착하고 신분증을 가져갈 거예요."
      },
      "anchor": {
        "spanish": "Entonces voy a llegar antes de las ocho y llevar mi identificación.",
        "korean": "그러면 여덟 시 전에 도착하고 신분증을 가져갈 거예요."
      },
      "vocabDomain": {
        "english": "input response",
        "korean": "읽기 후 행동, 준비물, 시간",
        "tags": [
          "p2m05-real-world-input",
          "input-response",
          "day-162"
        ]
      },
      "focus": {
        "readingListeningKo": "공지문을 읽고 해야 할 일을 추립니다.",
        "speakingKo": "읽은 정보에 따라 내 다음 행동을 말합니다.",
        "testKo": "읽기 입력을 실제 말하기로 전환합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d162-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d162-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Entonces voy a...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d162-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "공지문을 읽고 해야 할 일을 추립니다."
          },
          {
            "id": "p2-d162-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "읽은 정보에 따라 내 다음 행동을 말합니다."
          },
          {
            "id": "p2-d162-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 163,
      "phaseDay": 73,
      "week": 24,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Skimming and scanning",
      "englishOutcome": "Use different reading speeds for different goals.",
      "koreanTitle": "훑어읽기와 찾아읽기",
      "koreanGoal": "전체 의미와 특정 정보를 다른 방식으로 찾습니다.",
      "grammar": {
        "id": "p2-pat-163-busco-la-informacion-sobre",
        "name": "Busco la información sobre...",
        "koreanName": "필요 정보 찾기",
        "anchorSpanish": "Busco la información sobre horarios, no todos los detalles.",
        "anchorKorean": "모든 세부 내용이 아니라 시간표 정보를 찾고 있어요."
      },
      "anchor": {
        "spanish": "Busco la información sobre horarios, no todos los detalles.",
        "korean": "모든 세부 내용이 아니라 시간표 정보를 찾고 있어요."
      },
      "vocabDomain": {
        "english": "reading strategies",
        "korean": "전체 의미, 특정 정보, 시간표",
        "tags": [
          "p2m05-real-world-input",
          "reading-strategies",
          "day-163"
        ]
      },
      "focus": {
        "readingListeningKo": "같은 글을 훑어읽기와 찾아읽기로 두 번 봅니다.",
        "speakingKo": "무엇을 찾는지 말하고 필요한 정보만 설명합니다.",
        "testKo": "글 전체를 번역하지 않고 필요한 정보를 찾습니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d163-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d163-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Busco la información sobre...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d163-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "같은 글을 훑어읽기와 찾아읽기로 두 번 봅니다."
          },
          {
            "id": "p2-d163-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "무엇을 찾는지 말하고 필요한 정보만 설명합니다."
          },
          {
            "id": "p2-d163-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 164,
      "phaseDay": 74,
      "week": 24,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Real-world input review",
      "englishOutcome": "Combine signs, messages, reviews, and announcements.",
      "koreanTitle": "실전 입력 통합",
      "koreanGoal": "여러 입력 자료에서 필요한 정보를 찾아 계획을 세웁니다.",
      "grammar": {
        "id": "p2-pat-164-con-esta-informacion-podemos",
        "name": "Con esta información, podemos...",
        "koreanName": "정보 기반 결정",
        "anchorSpanish": "Con esta información, podemos cambiar el plan y salir más temprano.",
        "anchorKorean": "이 정보를 바탕으로 계획을 바꾸고 더 일찍 출발할 수 있어요."
      },
      "anchor": {
        "spanish": "Con esta información, podemos cambiar el plan y salir más temprano.",
        "korean": "이 정보를 바탕으로 계획을 바꾸고 더 일찍 출발할 수 있어요."
      },
      "vocabDomain": {
        "english": "input review",
        "korean": "공지, 리뷰, 메시지, 결정",
        "tags": [
          "p2m05-real-world-input",
          "input-review",
          "day-164"
        ]
      },
      "focus": {
        "readingListeningKo": "복합 자료를 읽고 결정에 필요한 근거를 찾습니다.",
        "speakingKo": "읽고 들은 정보를 바탕으로 계획을 말합니다.",
        "testKo": "근거 있는 결정을 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d164-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d164-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Con esta información, podemos...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d164-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "복합 자료를 읽고 결정에 필요한 근거를 찾습니다."
          },
          {
            "id": "p2-d164-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "읽고 들은 정보를 바탕으로 계획을 말합니다."
          },
          {
            "id": "p2-d164-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 165,
      "phaseDay": 75,
      "week": 24,
      "moduleId": "p2m05-real-world-input",
      "canonicalStatus": "planned",
      "cefrTarget": "A2 consolidation",
      "englishTheme": "Speaking checkpoint 7",
      "englishOutcome": "Use real-world input to solve a practical task.",
      "koreanTitle": "말하기 체크포인트 7",
      "koreanGoal": "공지, 메시지, 리뷰를 읽고 실제 결정을 설명합니다.",
      "grammar": {
        "id": "p2-pat-165-no-entiendo-todo-pero-entiendo-lo-im",
        "name": "No entiendo todo, pero entiendo lo importante.",
        "koreanName": "핵심 이해 자신감",
        "anchorSpanish": "No entiendo todo, pero entiendo lo importante y puedo preguntar.",
        "anchorKorean": "전부 이해하지는 못하지만 중요한 것은 이해하고 질문할 수 있어요."
      },
      "anchor": {
        "spanish": "No entiendo todo, pero entiendo lo importante y puedo preguntar.",
        "korean": "전부 이해하지는 못하지만 중요한 것은 이해하고 질문할 수 있어요."
      },
      "vocabDomain": {
        "english": "input checkpoint",
        "korean": "핵심 정보, 질문, 결정",
        "tags": [
          "p2m05-real-world-input",
          "input-checkpoint",
          "day-165"
        ]
      },
      "focus": {
        "readingListeningKo": "체크포인트 자료를 읽고 필수 정보를 표시합니다.",
        "speakingKo": "입력 자료를 바탕으로 결정과 질문을 말합니다.",
        "testKo": "실전 입력에서 필요한 정보를 찾아 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d165-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d165-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'No entiendo todo, pero entiendo lo importante.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d165-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "체크포인트 자료를 읽고 필수 정보를 표시합니다."
          },
          {
            "id": "p2-d165-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "입력 자료를 바탕으로 결정과 질문을 말합니다."
          },
          {
            "id": "p2-d165-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 166,
      "phaseDay": 76,
      "week": 24,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "A2 diagnostic review",
      "englishOutcome": "Find weak areas before final integration.",
      "koreanTitle": "A2 진단 복습",
      "koreanGoal": "말하기, 듣기, 읽기, 회상에서 약한 영역을 찾아 회복 계획을 세웁니다.",
      "grammar": {
        "id": "p2-pat-166-todavia-necesito-practicar",
        "name": "Todavía necesito practicar...",
        "koreanName": "아직 필요한 연습",
        "anchorSpanish": "Todavía necesito practicar escuchar números y explicar problemas.",
        "anchorKorean": "아직 숫자 듣기와 문제 설명을 연습해야 해요."
      },
      "anchor": {
        "spanish": "Todavía necesito practicar escuchar números y explicar problemas.",
        "korean": "아직 숫자 듣기와 문제 설명을 연습해야 해요."
      },
      "vocabDomain": {
        "english": "diagnostic",
        "korean": "약점, 회복, 계획",
        "tags": [
          "p2m06-a2-integration",
          "diagnostic",
          "day-166"
        ]
      },
      "focus": {
        "readingListeningKo": "자가진단 표를 읽고 약한 영역을 표시합니다.",
        "speakingKo": "내 약점과 이번 주 회복 계획을 말합니다.",
        "testKo": "약점을 숨기지 않고 구체적으로 말합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d166-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d166-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Todavía necesito practicar...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d166-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "자가진단 표를 읽고 약한 영역을 표시합니다."
          },
          {
            "id": "p2-d166-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "내 약점과 이번 주 회복 계획을 말합니다."
          },
          {
            "id": "p2-d166-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 167,
      "phaseDay": 77,
      "week": 24,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Full travel day mission",
      "englishOutcome": "Handle a full day of transport, food, and lodging.",
      "koreanTitle": "하루 여행 미션",
      "koreanGoal": "이동, 식사, 숙소 문제를 하루 흐름으로 처리합니다.",
      "grammar": {
        "id": "p2-pat-167-durante-el-viaje-necesito",
        "name": "Durante el viaje necesito...",
        "koreanName": "여행 중 필요한 것",
        "anchorSpanish": "Durante el viaje necesito confirmar el boleto, comer algo y llegar al hotel.",
        "anchorKorean": "여행 중 표를 확인하고, 뭔가 먹고, 호텔에 도착해야 해요."
      },
      "anchor": {
        "spanish": "Durante el viaje necesito confirmar el boleto, comer algo y llegar al hotel.",
        "korean": "여행 중 표를 확인하고, 뭔가 먹고, 호텔에 도착해야 해요."
      },
      "vocabDomain": {
        "english": "travel mission",
        "korean": "표, 식사, 호텔, 일정",
        "tags": [
          "p2m06-a2-integration",
          "travel-mission",
          "day-167"
        ]
      },
      "focus": {
        "readingListeningKo": "하루 여행 일정표를 읽고 위험 지점을 찾습니다.",
        "speakingKo": "여행 하루를 계획하고 문제 발생 시 대응합니다.",
        "testKo": "여행 상황을 순서대로 해결합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d167-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d167-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Durante el viaje necesito...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d167-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "하루 여행 일정표를 읽고 위험 지점을 찾습니다."
          },
          {
            "id": "p2-d167-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "여행 하루를 계획하고 문제 발생 시 대응합니다."
          },
          {
            "id": "p2-d167-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 168,
      "phaseDay": 78,
      "week": 25,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Local life mission",
      "englishOutcome": "Manage errands in a neighborhood.",
      "koreanTitle": "동네 생활 미션",
      "koreanGoal": "장보기, 약국, 은행, 카페를 연결해 실제 심부름을 합니다.",
      "grammar": {
        "id": "p2-pat-168-tengo-que-hacer-varios-mandados",
        "name": "Tengo que hacer varios mandados.",
        "koreanName": "여러 심부름",
        "anchorSpanish": "Tengo que hacer varios mandados: ir al banco, comprar medicina y pedir café.",
        "anchorKorean": "은행에 가고 약을 사고 커피를 주문하는 여러 심부름을 해야 해요."
      },
      "anchor": {
        "spanish": "Tengo que hacer varios mandados: ir al banco, comprar medicina y pedir café.",
        "korean": "은행에 가고 약을 사고 커피를 주문하는 여러 심부름을 해야 해요."
      },
      "vocabDomain": {
        "english": "errands",
        "korean": "심부름, 은행, 약국, 카페",
        "tags": [
          "p2m06-a2-integration",
          "errands",
          "day-168"
        ]
      },
      "focus": {
        "readingListeningKo": "동네 지도와 영업시간을 읽고 동선을 정합니다.",
        "speakingKo": "동네에서 해야 할 일을 순서대로 말합니다.",
        "testKo": "여러 장소에서 필요한 표현을 전환합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d168-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d168-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Tengo que hacer varios mandados.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d168-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "동네 지도와 영업시간을 읽고 동선을 정합니다."
          },
          {
            "id": "p2-d168-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "동네에서 해야 할 일을 순서대로 말합니다."
          },
          {
            "id": "p2-d168-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 169,
      "phaseDay": 79,
      "week": 25,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Social evening mission",
      "englishOutcome": "Meet people, make plans, and manage preferences.",
      "koreanTitle": "저녁 사회적 미션",
      "koreanGoal": "사람을 만나고 취향을 조율하며 다음 약속까지 정합니다.",
      "grammar": {
        "id": "p2-pat-169-me-gustaria-conocer-mas-personas",
        "name": "Me gustaría conocer más personas.",
        "koreanName": "사람 만나기 목표",
        "anchorSpanish": "Me gustaría conocer más personas y practicar en conversaciones reales.",
        "anchorKorean": "더 많은 사람을 만나고 실제 대화에서 연습하고 싶어요."
      },
      "anchor": {
        "spanish": "Me gustaría conocer más personas y practicar en conversaciones reales.",
        "korean": "더 많은 사람을 만나고 실제 대화에서 연습하고 싶어요."
      },
      "vocabDomain": {
        "english": "social mission",
        "korean": "소개, 취향, 약속, 조율",
        "tags": [
          "p2m06-a2-integration",
          "social-mission",
          "day-169"
        ]
      },
      "focus": {
        "readingListeningKo": "모임 안내와 채팅을 읽고 참여 조건을 파악합니다.",
        "speakingKo": "새 사람과 대화하고 약속을 조율합니다.",
        "testKo": "소개부터 다음 계획까지 이어갑니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d169-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d169-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Me gustaría conocer más personas.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d169-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "모임 안내와 채팅을 읽고 참여 조건을 파악합니다."
          },
          {
            "id": "p2-d169-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "새 사람과 대화하고 약속을 조율합니다."
          },
          {
            "id": "p2-d169-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 170,
      "phaseDay": 80,
      "week": 25,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Housing problem mission",
      "englishOutcome": "Resolve a housing or utility problem.",
      "koreanTitle": "주거 문제 미션",
      "koreanGoal": "집 문제를 신고하고 일정과 책임을 확인합니다.",
      "grammar": {
        "id": "p2-pat-170-necesito-resolver-un-problema-en-mi-",
        "name": "Necesito resolver un problema en mi departamento.",
        "koreanName": "집 문제 해결",
        "anchorSpanish": "Necesito resolver un problema en mi departamento antes del fin de semana.",
        "anchorKorean": "주말 전까지 제 아파트 문제를 해결해야 해요."
      },
      "anchor": {
        "spanish": "Necesito resolver un problema en mi departamento antes del fin de semana.",
        "korean": "주말 전까지 제 아파트 문제를 해결해야 해요."
      },
      "vocabDomain": {
        "english": "housing mission",
        "korean": "집, 수리, 일정, 책임",
        "tags": [
          "p2m06-a2-integration",
          "housing-mission",
          "day-170"
        ]
      },
      "focus": {
        "readingListeningKo": "관리자 메시지를 읽고 해야 할 일을 정리합니다.",
        "speakingKo": "집 문제를 설명하고 방문 일정을 잡습니다.",
        "testKo": "문제 해결 절차를 끝까지 진행합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d170-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d170-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Necesito resolver un problema en mi departamento.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d170-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "관리자 메시지를 읽고 해야 할 일을 정리합니다."
          },
          {
            "id": "p2-d170-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "집 문제를 설명하고 방문 일정을 잡습니다."
          },
          {
            "id": "p2-d170-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 171,
      "phaseDay": 81,
      "week": 25,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Health and pharmacy mission",
      "englishOutcome": "Move from symptoms to pharmacy or clinic action.",
      "koreanTitle": "건강과 약국 미션",
      "koreanGoal": "증상을 설명하고 병원/약국에서 다음 행동을 결정합니다.",
      "grammar": {
        "id": "p2-pat-171-me-siento-mal-desde",
        "name": "Me siento mal desde...",
        "koreanName": "건강 문제 시작",
        "anchorSpanish": "Me siento mal desde ayer y necesito saber si debo ir al doctor.",
        "anchorKorean": "어제부터 몸이 안 좋아서 의사에게 가야 하는지 알고 싶어요."
      },
      "anchor": {
        "spanish": "Me siento mal desde ayer y necesito saber si debo ir al doctor.",
        "korean": "어제부터 몸이 안 좋아서 의사에게 가야 하는지 알고 싶어요."
      },
      "vocabDomain": {
        "english": "health mission",
        "korean": "증상, 기간, 약, 의사",
        "tags": [
          "p2m06-a2-integration",
          "health-mission",
          "day-171"
        ]
      },
      "focus": {
        "readingListeningKo": "문진 안내를 읽고 필요한 건강 정보를 준비합니다.",
        "speakingKo": "증상과 조건을 설명하고 조언을 구합니다.",
        "testKo": "건강 상황에서 안전하게 의사소통합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d171-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d171-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Me siento mal desde...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d171-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "문진 안내를 읽고 필요한 건강 정보를 준비합니다."
          },
          {
            "id": "p2-d171-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "증상과 조건을 설명하고 조언을 구합니다."
          },
          {
            "id": "p2-d171-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 172,
      "phaseDay": 82,
      "week": 25,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Work or study mission",
      "englishOutcome": "Discuss schedule, tasks, and progress.",
      "koreanTitle": "일과 공부 미션",
      "koreanGoal": "일정, 과제, 진전, 어려움을 설명합니다.",
      "grammar": {
        "id": "p2-pat-172-estoy-avanzando-pero-necesito",
        "name": "Estoy avanzando, pero necesito...",
        "koreanName": "진전과 필요",
        "anchorSpanish": "Estoy avanzando, pero necesito más práctica con conversaciones rápidas.",
        "anchorKorean": "진전은 있지만 빠른 대화 연습이 더 필요해요."
      },
      "anchor": {
        "spanish": "Estoy avanzando, pero necesito más práctica con conversaciones rápidas.",
        "korean": "진전은 있지만 빠른 대화 연습이 더 필요해요."
      },
      "vocabDomain": {
        "english": "work-study mission",
        "korean": "일정, 과제, 진전, 어려움",
        "tags": [
          "p2m06-a2-integration",
          "work-study-mission",
          "day-172"
        ]
      },
      "focus": {
        "readingListeningKo": "업무/수업 메시지를 읽고 해야 할 일을 표시합니다.",
        "speakingKo": "내 진행 상황과 필요한 도움을 말합니다.",
        "testKo": "업무나 수업 맥락에서 업데이트합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d172-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d172-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Estoy avanzando, pero necesito...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d172-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "업무/수업 메시지를 읽고 해야 할 일을 표시합니다."
          },
          {
            "id": "p2-d172-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "내 진행 상황과 필요한 도움을 말합니다."
          },
          {
            "id": "p2-d172-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 173,
      "phaseDay": 83,
      "week": 25,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Opinion mission",
      "englishOutcome": "Discuss a simple topic with reasons and compromise.",
      "koreanTitle": "의견 조율 미션",
      "koreanGoal": "간단한 주제에 대해 이유를 말하고 합의점을 찾습니다.",
      "grammar": {
        "id": "p2-pat-173-podemos-estar-de-acuerdo-en",
        "name": "Podemos estar de acuerdo en...",
        "koreanName": "합의점 찾기",
        "anchorSpanish": "Podemos estar de acuerdo en que necesitamos una opción más tranquila.",
        "anchorKorean": "더 조용한 선택지가 필요하다는 점에는 동의할 수 있어요."
      },
      "anchor": {
        "spanish": "Podemos estar de acuerdo en que necesitamos una opción más tranquila.",
        "korean": "더 조용한 선택지가 필요하다는 점에는 동의할 수 있어요."
      },
      "vocabDomain": {
        "english": "opinion mission",
        "korean": "의견, 이유, 합의, 대안",
        "tags": [
          "p2m06-a2-integration",
          "opinion-mission",
          "day-173"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 의견 자료를 읽고 찬반 이유를 정리합니다.",
        "speakingKo": "의견 차이를 말하고 합의점을 찾습니다.",
        "testKo": "이유와 양보를 사용해 대화합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d173-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d173-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Podemos estar de acuerdo en...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d173-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 의견 자료를 읽고 찬반 이유를 정리합니다."
          },
          {
            "id": "p2-d173-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "의견 차이를 말하고 합의점을 찾습니다."
          },
          {
            "id": "p2-d173-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 174,
      "phaseDay": 84,
      "week": 25,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Story mission",
      "englishOutcome": "Tell a personal story with a clear arc.",
      "koreanTitle": "개인 이야기 미션",
      "koreanGoal": "시작, 문제, 변화, 배운 점이 있는 이야기를 말합니다.",
      "grammar": {
        "id": "p2-pat-174-al-principio-luego-aprendi-que",
        "name": "Al principio... luego aprendí que...",
        "koreanName": "이야기 흐름",
        "anchorSpanish": "Al principio tenía miedo, luego aprendí que pedir ayuda es normal.",
        "anchorKorean": "처음에는 두려웠지만 도움을 요청하는 것이 자연스럽다는 것을 배웠어요."
      },
      "anchor": {
        "spanish": "Al principio tenía miedo, luego aprendí que pedir ayuda es normal.",
        "korean": "처음에는 두려웠지만 도움을 요청하는 것이 자연스럽다는 것을 배웠어요."
      },
      "vocabDomain": {
        "english": "story mission",
        "korean": "시작, 문제, 변화, 교훈",
        "tags": [
          "p2m06-a2-integration",
          "story-mission",
          "day-174"
        ]
      },
      "focus": {
        "readingListeningKo": "개인 경험 글을 읽고 이야기 구조를 봅니다.",
        "speakingKo": "내 학습 경험을 이야기 구조로 말합니다.",
        "testKo": "2분 개인 이야기를 완성합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d174-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d174-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Al principio... luego aprendí que...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d174-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "개인 경험 글을 읽고 이야기 구조를 봅니다."
          },
          {
            "id": "p2-d174-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "내 학습 경험을 이야기 구조로 말합니다."
          },
          {
            "id": "p2-d174-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 175,
      "phaseDay": 85,
      "week": 26,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Weak-word recovery day",
      "englishOutcome": "Recycle personally weak words through mixed prompts.",
      "koreanTitle": "약한 단어 회복일",
      "koreanGoal": "잘 안 나오는 단어를 여러 상황에서 다시 사용합니다.",
      "grammar": {
        "id": "p2-pat-175-quiero-volver-a-practicar-estas-pala",
        "name": "Quiero volver a practicar estas palabras.",
        "koreanName": "약한 단어 재연습",
        "anchorSpanish": "Quiero volver a practicar estas palabras hasta usarlas sin pensar.",
        "anchorKorean": "생각하지 않고 쓸 때까지 이 단어들을 다시 연습하고 싶어요."
      },
      "anchor": {
        "spanish": "Quiero volver a practicar estas palabras hasta usarlas sin pensar.",
        "korean": "생각하지 않고 쓸 때까지 이 단어들을 다시 연습하고 싶어요."
      },
      "vocabDomain": {
        "english": "weak word recovery",
        "korean": "약한 단어, 반복, 새 상황",
        "tags": [
          "p2m06-a2-integration",
          "weak-word-recovery",
          "day-175"
        ]
      },
      "focus": {
        "readingListeningKo": "약한 단어 목록과 예문을 읽고 상황별로 묶습니다.",
        "speakingKo": "약한 단어를 여행, 건강, 사회 상황에 넣어 말합니다.",
        "testKo": "약한 단어를 새 문맥에서 회상합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d175-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d175-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Quiero volver a practicar estas palabras.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d175-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "약한 단어 목록과 예문을 읽고 상황별로 묶습니다."
          },
          {
            "id": "p2-d175-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "약한 단어를 여행, 건강, 사회 상황에 넣어 말합니다."
          },
          {
            "id": "p2-d175-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 176,
      "phaseDay": 86,
      "week": 26,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Speed and calm drill",
      "englishOutcome": "Answer faster without losing clarity.",
      "koreanTitle": "속도와 침착함 훈련",
      "koreanGoal": "빠르게 답하되 핵심 정보는 놓치지 않습니다.",
      "grammar": {
        "id": "p2-pat-176-voy-a-responder-simple-y-claro",
        "name": "Voy a responder simple y claro.",
        "koreanName": "간단하고 명확하게 답하기",
        "anchorSpanish": "Voy a responder simple y claro, aunque no sea perfecto.",
        "anchorKorean": "완벽하지 않아도 간단하고 명확하게 답할 거예요."
      },
      "anchor": {
        "spanish": "Voy a responder simple y claro, aunque no sea perfecto.",
        "korean": "완벽하지 않아도 간단하고 명확하게 답할 거예요."
      },
      "vocabDomain": {
        "english": "speed drill",
        "korean": "빠른 답변, 명확성, 핵심",
        "tags": [
          "p2m06-a2-integration",
          "speed-drill",
          "day-176"
        ]
      },
      "focus": {
        "readingListeningKo": "짧은 질문 세트를 읽고 핵심 답변만 준비합니다.",
        "speakingKo": "랜덤 질문에 10초 안에 시작해서 답합니다.",
        "testKo": "속도보다 시작하는 힘과 명확성을 봅니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d176-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d176-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Voy a responder simple y claro.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d176-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "짧은 질문 세트를 읽고 핵심 답변만 준비합니다."
          },
          {
            "id": "p2-d176-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "랜덤 질문에 10초 안에 시작해서 답합니다."
          },
          {
            "id": "p2-d176-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "shadowing",
        "titleKo": "섀도잉 부스터",
        "activitiesKo": [
          "오늘 앵커 문장을 8회 따라 말합니다.",
          "속도를 70%, 85%, 자연 속도로 나누어 반복합니다.",
          "마지막에는 한국어를 보고 스페인어로 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 177,
      "phaseDay": 87,
      "week": 26,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Listening-readiness drill",
      "englishOutcome": "Prepare for fast or imperfect input.",
      "koreanTitle": "빠른 입력 대비",
      "koreanGoal": "빠르거나 불완전한 입력을 들었을 때 확인 질문으로 복구합니다.",
      "grammar": {
        "id": "p2-pat-177-puede-repetir-la-parte-de",
        "name": "¿Puede repetir la parte de...?",
        "koreanName": "부분 반복 요청",
        "anchorSpanish": "¿Puede repetir la parte de la dirección, por favor?",
        "anchorKorean": "주소 부분을 다시 말씀해 주실 수 있나요?"
      },
      "anchor": {
        "spanish": "¿Puede repetir la parte de la dirección, por favor?",
        "korean": "주소 부분을 다시 말씀해 주실 수 있나요?"
      },
      "vocabDomain": {
        "english": "listening repair",
        "korean": "부분 반복, 주소, 숫자, 확인",
        "tags": [
          "p2m06-a2-integration",
          "listening-repair",
          "day-177"
        ]
      },
      "focus": {
        "readingListeningKo": "빠른 안내문 스크립트를 읽고 놓치기 쉬운 정보를 표시합니다.",
        "speakingKo": "못 들은 부분만 지정해서 다시 요청합니다.",
        "testKo": "전체 반복이 아니라 필요한 부분을 요청합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d177-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d177-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'¿Puede repetir la parte de...?' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d177-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "빠른 안내문 스크립트를 읽고 놓치기 쉬운 정보를 표시합니다."
          },
          {
            "id": "p2-d177-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "못 들은 부분만 지정해서 다시 요청합니다."
          },
          {
            "id": "p2-d177-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "sentence_expansion",
        "titleKo": "문장 확장 부스터",
        "activitiesKo": [
          "오늘 앵커 문장에 시간, 장소, 이유를 하나씩 붙입니다.",
          "짧은 문장 세 개를 하나의 답변으로 연결합니다.",
          "마지막 답변을 45초로 늘립니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 178,
      "phaseDay": 88,
      "week": 26,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Final rehearsal",
      "englishOutcome": "Run a mixed A2 scenario with coaching available.",
      "koreanTitle": "최종 리허설",
      "koreanGoal": "여행, 사회, 문제 해결이 섞인 긴 역할극을 코칭과 함께 연습합니다.",
      "grammar": {
        "id": "p2-pat-178-voy-a-manejar-la-situacion-paso-a-pa",
        "name": "Voy a manejar la situación paso a paso.",
        "koreanName": "단계별 처리",
        "anchorSpanish": "Voy a manejar la situación paso a paso y pedir ayuda si la necesito.",
        "anchorKorean": "상황을 단계별로 처리하고 필요하면 도움을 요청할 거예요."
      },
      "anchor": {
        "spanish": "Voy a manejar la situación paso a paso y pedir ayuda si la necesito.",
        "korean": "상황을 단계별로 처리하고 필요하면 도움을 요청할 거예요."
      },
      "vocabDomain": {
        "english": "final rehearsal",
        "korean": "혼합 상황, 단계, 도움 요청",
        "tags": [
          "p2m06-a2-integration",
          "final-rehearsal",
          "day-178"
        ]
      },
      "focus": {
        "readingListeningKo": "최종 미션 지시문을 읽고 필요한 전략을 정리합니다.",
        "speakingKo": "긴 역할극을 단계별로 수행합니다.",
        "testKo": "코칭 모드에서 마지막 약점을 확인합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d178-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d178-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Voy a manejar la situación paso a paso.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d178-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "최종 미션 지시문을 읽고 필요한 전략을 정리합니다."
          },
          {
            "id": "p2-d178-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "긴 역할극을 단계별로 수행합니다."
          },
          {
            "id": "p2-d178-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "role_play",
        "titleKo": "역할극 부스터",
        "activitiesKo": [
          "오늘 상황을 한 번은 테스트 모드로 답합니다.",
          "두 번째는 더 공손하게 다시 답합니다.",
          "세 번째는 문제가 생긴 버전으로 바꾸어 답합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 179,
      "phaseDay": 89,
      "week": 26,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Final A2 speaking test",
      "englishOutcome": "Complete an A2 mixed role-play without coaching.",
      "koreanTitle": "최종 A2 말하기 시험",
      "koreanGoal": "코칭 없이 혼합 상황 대화를 시작하고 복구하고 마무리합니다.",
      "grammar": {
        "id": "p2-pat-179-puedo-comunicarme-en-situaciones-rea",
        "name": "Puedo comunicarme en situaciones reales.",
        "koreanName": "실전 의사소통 선언",
        "anchorSpanish": "Puedo comunicarme en situaciones reales, pedir ayuda y seguir adelante.",
        "anchorKorean": "실제 상황에서 의사소통하고 도움을 요청하며 계속 나아갈 수 있어요."
      },
      "anchor": {
        "spanish": "Puedo comunicarme en situaciones reales, pedir ayuda y seguir adelante.",
        "korean": "실제 상황에서 의사소통하고 도움을 요청하며 계속 나아갈 수 있어요."
      },
      "vocabDomain": {
        "english": "final speaking test",
        "korean": "실전, 복구, 자신감, 마무리",
        "tags": [
          "p2m06-a2-integration",
          "final-speaking-test",
          "day-179"
        ]
      },
      "focus": {
        "readingListeningKo": "시험 조건과 평가 기준을 읽고 목표를 확인합니다.",
        "speakingKo": "혼합 상황 역할극을 코칭 없이 수행합니다.",
        "testKo": "의미 전달, 복구, 자신감, 마무리를 평가합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d179-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d179-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Puedo comunicarme en situaciones reales.' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d179-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "시험 조건과 평가 기준을 읽고 목표를 확인합니다."
          },
          {
            "id": "p2-d179-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "혼합 상황 역할극을 코칭 없이 수행합니다."
          },
          {
            "id": "p2-d179-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "writing",
        "titleKo": "짧은 쓰기 부스터",
        "activitiesKo": [
          "오늘 표현으로 5문장 메시지를 씁니다.",
          "문장을 더 쉬운 말로 한 번 다시 씁니다.",
          "쓴 내용을 소리 내어 읽고 한 문장 외웁니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    },
    {
      "day": 180,
      "phaseDay": 90,
      "week": 26,
      "moduleId": "p2m06-a2-integration",
      "canonicalStatus": "planned",
      "cefrTarget": "Confident A2",
      "englishTheme": "Day 180 recovery and next plan",
      "englishOutcome": "Reflect, recover weak points, and plan the next phase.",
      "koreanTitle": "180일 회고와 다음 계획",
      "koreanGoal": "A2 학습을 돌아보고 다음 30일 유지 계획을 세웁니다.",
      "grammar": {
        "id": "p2-pat-180-mi-siguiente-paso-es",
        "name": "Mi siguiente paso es...",
        "koreanName": "다음 단계 말하기",
        "anchorSpanish": "Mi siguiente paso es mantener el hábito y hablar con personas reales cada semana.",
        "anchorKorean": "제 다음 단계는 습관을 유지하고 매주 실제 사람들과 말하는 거예요."
      },
      "anchor": {
        "spanish": "Mi siguiente paso es mantener el hábito y hablar con personas reales cada semana.",
        "korean": "제 다음 단계는 습관을 유지하고 매주 실제 사람들과 말하는 거예요."
      },
      "vocabDomain": {
        "english": "next phase",
        "korean": "회고, 유지, 다음 목표",
        "tags": [
          "p2m06-a2-integration",
          "next-phase",
          "day-180"
        ]
      },
      "focus": {
        "readingListeningKo": "180일 회고 질문을 읽고 성과와 약점을 정리합니다.",
        "speakingKo": "내 성과, 약점, 다음 계획을 말합니다.",
        "testKo": "학습을 끝내지 않고 유지 계획으로 전환합니다."
      },
      "required60": {
        "totalMinutes": 60,
        "blocks": [
          {
            "id": "p2-d180-review",
            "kind": "review",
            "minutes": 10,
            "titleKo": "SRS와 약한 단어 준비",
            "goalKo": "기존 카드와 약한 단어를 먼저 깨워 오늘 말하기 부담을 낮춥니다."
          },
          {
            "id": "p2-d180-pattern",
            "kind": "new_pattern",
            "minutes": 12,
            "titleKo": "새 패턴 입에 붙이기",
            "goalKo": "'Mi siguiente paso es...' 패턴을 설명보다 먼저 문장으로 반복합니다."
          },
          {
            "id": "p2-d180-input",
            "kind": "input",
            "minutes": 14,
            "titleKo": "읽기/듣기 입력",
            "goalKo": "180일 회고 질문을 읽고 성과와 약점을 정리합니다."
          },
          {
            "id": "p2-d180-speaking",
            "kind": "speaking_reps",
            "minutes": 18,
            "titleKo": "말하기 반복",
            "goalKo": "내 성과, 약점, 다음 계획을 말합니다."
          },
          {
            "id": "p2-d180-checkout",
            "kind": "checkout",
            "minutes": 6,
            "titleKo": "체크아웃",
            "goalKo": "오늘 말한 문장 하나, 아직 막히는 단어 하나, 내일 다시 쓸 표현 하나를 기록합니다."
          }
        ]
      },
      "booster30": {
        "type": "listening_dictation",
        "titleKo": "듣기 받아쓰기 부스터",
        "activitiesKo": [
          "오늘 앵커와 핵심 문장을 듣고 빈칸을 채웁니다.",
          "숫자, 시간, 장소 표현을 따로 적습니다.",
          "들은 내용을 한 문장으로 요약해 말합니다."
        ],
        "totalMinutes": 30,
        "optional": true,
        "completionKo": "필수 60분을 끝낸 뒤 에너지가 있을 때만 진행합니다. 피곤하면 다음 날 복습 카드로 넘깁니다."
      }
    }
  ]
}
