--- a/gateway/platforms/nutrition_onboarding_reconciliation.py
+++ b/gateway/platforms/nutrition_onboarding_reconciliation.py
@@ -67,34 +67,73 @@
             return ", ".join(str(item) for item in raw) or default
         return str(raw)
 
-    health_fields = (
-        "medical_conditions",
-        "medications",
-        "pregnancy_lactation",
-        "eating_disorder_risk",
-    )
+    def enum_value(field: str, labels: dict[str, str]) -> str:
+        raw = answers.get(field)
+        return labels.get(raw, "미입력") if isinstance(raw, str) else "미입력"
+
+    def structured_items(field: str) -> str:
+        raw = answers.get(field)
+        if not isinstance(raw, dict):
+            return "미입력"
+        structured = cast(dict[str, object], raw)
+        status = structured.get("status")
+        if status == "none":
+            return "없음"
+        items = structured.get("items")
+        if status != "provided" or not isinstance(items, list):
+            return "미입력"
+        provided = [
+            item
+            for item in cast(list[object], items)
+            if isinstance(item, str) and item
+        ]
+        return ", ".join(provided) or "미입력"
+
+    def has_provided_items(field: str) -> bool:
+        raw = answers.get(field)
+        return (
+            isinstance(raw, dict)
+            and cast(dict[str, object], raw).get("status") == "provided"
+        )
+
     health_review = (
         "검토할 입력이 있습니다."
-        if any(value(field, default="없음") not in {"없음", "해당 없음", "아니요"}
-               for field in health_fields)
+        if (
+            has_provided_items("conditions")
+            or has_provided_items("medications")
+            or answers.get("pregnancy_breastfeeding") is not False
+            or answers.get("eating_disorder_risk") is not False
+        )
         else "별도 검토 입력이 없습니다."
     )
     restrictions = " · ".join(
-        value(field, default="없음")
-        for field in (
-            "allergies",
-            "intolerances",
-            "dietary_preferences",
-            "religious_restrictions",
+        f"{label} {structured_items(field)}"
+        for label, field in (
+            ("알레르기", "allergies"),
+            ("불내증", "intolerances"),
+            ("종교·윤리 제한", "religious_ethical_exclusions"),
+            ("비선호 식품", "disliked_foods"),
+            ("식품 선호", "dietary_preferences"),
         )
     )
+    goal = enum_value(
+        "goal_type",
+        {"loss": "감량", "maintain": "유지", "gain": "증량"},
+    )
+    activity = enum_value(
+        "activity_category",
+        {
+            "sedentary": "좌식",
+            "light": "가벼움",
+            "moderate": "보통",
+            "very_active": "매우 활동적",
+            "extra_active": "최고 활동",
+        },
+    )
     return "\n".join(
         (
-            f"- 목표: {value('goal')}",
-            (
-                "- 활동: "
-                f"{value('activity_category')} · {value('training_details')}"
-            ),
+            f"- 목표: {goal}",
+            f"- 활동: {activity} · {value('activity_rationale')}",
             f"- 식사: 하루 {value('meal_count')}끼",
             (
                 "- 조리·예산: "
--- a/gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py
+++ b/gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py
@@ -124,15 +124,23 @@
                     action = None
                 else:
                     summary_ko = reconciliation.summary_ko
+                    facts_ko = reconciliation.facts_ko
+                    safety_observations_ko = (
+                        reconciliation.safety_observations_ko
+                    )
                     if current_index:
                         summary_ko = render_authoritative_customer_summary(
                             answers
                         )
+                        facts_ko = ()
+                        safety_observations_ko = ()
                     reconciliation = replace(
                         reconciliation,
                         summary_ko=summary_ko,
+                        facts_ko=facts_ko,
                         ambiguities_ko=(),
                         contradictions_ko=(),
+                        safety_observations_ko=safety_observations_ko,
                         clarifications=(),
                     )
                     text = (
--- a/tests/gateway/test_nutrition_onboarding_reconciliation.py
+++ b/tests/gateway/test_nutrition_onboarding_reconciliation.py
@@ -22,6 +22,7 @@
     ReconciliationUnavailable,
     parse_reconciliation_json,
     reconciliation_payload,
+    render_authoritative_customer_summary,
     render_reconciliation_text,
 )
 from gateway.platforms.telegram_nutrition_onboarding_runtime import (
@@ -175,6 +176,112 @@
     }
 
 
+def test_authoritative_summary_renders_canonical_customer_values() -> None:
+    answers: dict[str, object] = {
+        "date_of_birth": "1996-08-01",
+        "equation_sex_basis": "male",
+        "height_cm": "180",
+        "weight_kg": "80",
+        "activity_category": "moderate",
+        "activity_rationale": "주 3회 근력 운동",
+        "goal_type": "maintain",
+        "target_weight_kg": None,
+        "target_date": None,
+        "allergies": {"status": "none", "items": []},
+        "intolerances": {"status": "none", "items": []},
+        "religious_ethical_exclusions": {
+            "status": "none",
+            "items": [],
+        },
+        "disliked_foods": {"status": "none", "items": []},
+        "dietary_preferences": {"status": "none", "items": []},
+        "conditions": {"status": "none", "items": []},
+        "medications": {"status": "none", "items": []},
+        "pregnancy_breastfeeding": False,
+        "eating_disorder_risk": False,
+        "cooking_access": "기본 조리 가능",
+        "budget_band": "보통",
+        "meal_count": 3,
+        "schedule_constraints": "없음",
+    }
+
+    rendered = render_authoritative_customer_summary(answers)
+
+    assert "- 목표: 유지" in rendered
+    assert "- 활동: 보통 · 주 3회 근력 운동" in rendered
+    assert "알레르기 없음" in rendered
+    assert "불내증 없음" in rendered
+    assert "종교·윤리 제한 없음" in rendered
+    assert "비선호 식품 없음" in rendered
+    assert "식품 선호 없음" in rendered
+    assert "- 건강 관련 입력: 별도 검토 입력이 없습니다." in rendered
+    assert "{" not in rendered
+    assert "}" not in rendered
+    assert "status" not in rendered
+
+
+def test_authoritative_summary_renders_provided_items_as_customer_text() -> None:
+    answers: dict[str, object] = {
+        "goal_type": "loss",
+        "activity_category": "very_active",
+        "activity_rationale": "주 5회 운동",
+        "allergies": {"status": "provided", "items": ["땅콩", "새우"]},
+        "intolerances": {"status": "none", "items": []},
+        "religious_ethical_exclusions": {
+            "status": "provided",
+            "items": ["돼지고기"],
+        },
+        "disliked_foods": {"status": "provided", "items": ["가지"]},
+        "dietary_preferences": {
+            "status": "provided",
+            "items": ["고단백식"],
+        },
+        "conditions": {"status": "none", "items": []},
+        "medications": {"status": "none", "items": []},
+        "pregnancy_breastfeeding": False,
+        "eating_disorder_risk": False,
+    }
+
+    rendered = render_authoritative_customer_summary(answers)
+
+    assert "- 목표: 감량" in rendered
+    assert "- 활동: 매우 활동적 · 주 5회 운동" in rendered
+    assert "알레르기 땅콩, 새우" in rendered
+    assert "종교·윤리 제한 돼지고기" in rendered
+    assert "비선호 식품 가지" in rendered
+    assert "식품 선호 고단백식" in rendered
+    assert "{" not in rendered
+    assert "status" not in rendered
+
+
+@pytest.mark.parametrize(
+    ("field", "value"),
+    (
+        ("conditions", {"status": "provided", "items": ["고혈압"]}),
+        ("medications", {"status": "provided", "items": ["철분"]}),
+        ("pregnancy_breastfeeding", True),
+        ("pregnancy_breastfeeding", None),
+        ("eating_disorder_risk", True),
+        ("eating_disorder_risk", None),
+    ),
+)
+def test_authoritative_summary_classifies_safety_review_inputs(
+    field: str,
+    value: object,
+) -> None:
+    answers: dict[str, object] = {
+        "conditions": {"status": "none", "items": []},
+        "medications": {"status": "none", "items": []},
+        "pregnancy_breastfeeding": False,
+        "eating_disorder_risk": False,
+    }
+    answers[field] = value
+
+    rendered = render_authoritative_customer_summary(answers)
+
+    assert "- 건강 관련 입력: 검토할 입력이 있습니다." in rendered
+
+
 def test_parse_reconciliation_json_accepts_exact_advisory_schema() -> None:
     parsed = parse_reconciliation_json(json.dumps(VALID, ensure_ascii=False))
 
@@ -385,6 +492,7 @@
     )
     sent = runtime.adapter._send_nutrition_topic.await_args.kwargs
     assert reconciliation.summary_ko in sent["text"]
+    assert "알레르기는 없습니다." in sent["text"]
     assert "입력 내용을 정리했어요" in sent["text"]
     button = sent["reply_markup"].inline_keyboard[0][0]
     assert button.text == "입력 내용이 맞습니다"
@@ -393,6 +501,90 @@
 
 
 @pytest.mark.asyncio
+async def test_resolved_clarification_discards_stale_advisory_sections() -> None:
+    runtime = object.__new__(TelegramNutritionOnboardingRuntime)
+    runtime.reconciler = SimpleNamespace(reconcile=AsyncMock())
+    runtime.adapter = SimpleNamespace(
+        _send_nutrition_topic=AsyncMock(
+            return_value=SimpleNamespace(message_id=207)
+        )
+    )
+    authority = SimpleNamespace(consent_granted=True)
+    setattr(runtime, "_current_authority", Mock(return_value=authority))
+    setattr(runtime, "_route", Mock(return_value=("-100", "20")))
+    answers: dict[str, object] = {
+        "activity_category": "moderate",
+        "activity_rationale": "주 3회 근력 운동",
+        "goal_type": "maintain",
+        "allergies": {"status": "none", "items": []},
+        "intolerances": {"status": "none", "items": []},
+        "religious_ethical_exclusions": {
+            "status": "none",
+            "items": [],
+        },
+        "disliked_foods": {"status": "none", "items": []},
+        "dietary_preferences": {"status": "none", "items": []},
+        "conditions": {"status": "none", "items": []},
+        "medications": {"status": "none", "items": []},
+        "pregnancy_breastfeeding": False,
+        "eating_disorder_risk": False,
+        "meal_count": 3,
+    }
+    record: dict[str, object] = {
+        "state": "resolved",
+        "answers_digest": _canonical_digest(answers),
+        "advisory": {
+            "summary_ko": "수정 전 활동 요약입니다.",
+            "facts_ko": ["수정 전 활동 사실입니다."],
+            "ambiguities_ko": ["수정 전 모호함입니다."],
+            "contradictions_ko": ["수정 전 모순입니다."],
+            "safety_observations_ko": ["수정 전 안전 참고입니다."],
+            "clarifications": [
+                {
+                    "field": "activity_rationale",
+                    "kind": "ambiguity",
+                    "question_ko": "수정 전 활동 확인 질문입니다.",
+                }
+            ],
+        },
+        "clarifications": [],
+        "current_index": 1,
+        "digest": "e" * 64,
+    }
+    store = SimpleNamespace(
+        load_session=Mock(side_effect=ValueError),
+        mark_prepared=Mock(
+            return_value=SimpleNamespace(state="PREPARED")
+        ),
+        mark_uncertain=Mock(),
+        mark_committed=Mock(),
+    )
+    service = SimpleNamespace(
+        store=store,
+        reconciliation_answers=Mock(return_value=answers),
+        reconciliation_record=Mock(return_value=record),
+    )
+    session = SimpleNamespace(session_id="session-1", sid_hash="a" * 64)
+    status = SimpleNamespace(
+        state=SimpleNamespace(value="customer_attestation"),
+        answer_count=22,
+    )
+
+    await getattr(runtime, "_publish")(session, service, status)
+
+    runtime.reconciler.reconcile.assert_not_awaited()
+    sent = runtime.adapter._send_nutrition_topic.await_args.kwargs["text"]
+    assert "- 목표: 유지" in sent
+    assert "- 활동: 보통 · 주 3회 근력 운동" in sent
+    assert "- 건강 관련 입력: 별도 검토 입력이 없습니다." in sent
+    assert "수정 전" not in sent
+    assert "확인된 내용" not in sent
+    assert "확인이 필요한 모호함" not in sent
+    assert "서로 맞지 않는 내용" not in sent
+    assert "안전 관련 참고사항" not in sent
+
+
+@pytest.mark.asyncio
 async def test_production_ambiguity_publishes_field_bound_force_reply() -> None:
     reconciliation = NutritionOnboardingReconciliation(
         summary_ko="식사 횟수를 확인해야 합니다.",
