{
  "schema": "nutricoach-telegram-checkin-stepper/task-7-korean-ux-visual-audit-v1",
  "status": "PASS",
  "blocker_count": 0,
  "absolute_cwd": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined",
  "capture_freshness": {
    "captured_at_utc": "2026-09-01T01:39:04.742543+00:00",
    "absolute_cwd": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined",
    "source_hashes": {
      "gateway/platforms/physique_checkin.py": "2a9d9dd79c52834e0cd941b4bac90dd8d137571e0377fa507350c29c890af93b",
      "gateway/platforms/physique_checkin_prompts.py": "6a72b232519335064fd1faa9bfcc7137a884c65a7d887cd3812f96fa6a448367",
      "gateway/platforms/telegram_physique_checkin_stepper.py": "45e480a6b48b68a94261a4969b81043e846edf36b5263e511c62ec2fea36b3ce",
      "gateway/platforms/telegram_checkin_stepper_transport.py": "d2184bd038f8cc7e0bb738897404c70d63445fe32b5ae0a72d52721120c93157",
      "gateway/platforms/telegram.py": "91fc4c4f163ece7bc59f6a75bd7e901255b515a2de4d59756858f5ba4841e52b"
    },
    "fresh_capture_after_source_hashes": true
  },
  "surface": "actual source WizardService + PhysiqueCheckinBridge WizardPrompt payloads; fake transport QA separately executed",
  "coverage": {
    "state_count": 10,
    "states": [
      "first_question",
      "later_known",
      "later_unknown",
      "previous_navigation",
      "corrected",
      "summary",
      "terminal",
      "invalid",
      "stale",
      "explicit_resume_nutrition_daily"
    ],
    "all_required_states_enumerated": true
  },
  "cards": [
    {
      "state": "first_question",
      "rendered_card": true,
      "receipt_variant": "resume",
      "text": "오늘 체크인 · 약 2~3분\n진행 1/12\n오늘 아침 체중을 숫자로 입력해 주세요.\n예: [예시 생략]",
      "keyboard": [
        [
          "잘 모르겠어요"
        ]
      ],
      "callback_structure": [
        {
          "label": "잘 모르겠어요",
          "namespace": "pc1",
          "step": "bodyweight",
          "version": 0,
          "action": "u",
          "byte_length": 51
        }
      ],
      "display_max_columns": 38,
      "contains_later": false,
      "value_free": true
    },
    {
      "state": "later_known",
      "rendered_card": true,
      "receipt_variant": "known",
      "text": "✅ 답변을 반영했습니다.\n\n진행 2/12\n어제 먹은 총칼로리를 숫자로 입력해 주세요.\n예: [예시 생략]",
      "keyboard": [
        [
          "이전 답 수정",
          "잘 모르겠어요"
        ]
      ],
      "callback_structure": [
        {
          "label": "이전 답 수정",
          "namespace": "pc1",
          "step": "calories",
          "version": 1,
          "action": "p",
          "byte_length": 49
        },
        {
          "label": "잘 모르겠어요",
          "namespace": "pc1",
          "step": "calories",
          "version": 1,
          "action": "u",
          "byte_length": 49
        }
      ],
      "display_max_columns": 42,
      "contains_later": false,
      "value_free": true
    },
    {
      "state": "later_unknown",
      "rendered_card": true,
      "receipt_variant": "unknown",
      "text": "✅ 잘 모르겠어요로 반영했습니다.\n\n진행 3/12\n어제 탄수화물, 단백질, 지방을 g 단위로 입력해 주세요.\n순서는 탄수화물 단백질 지방입니다. 예: [예시 생략]",
      "keyboard": [
        [
          "이전 답 수정",
          "잘 모르겠어요"
        ]
      ],
      "callback_structure": [
        {
          "label": "이전 답 수정",
          "namespace": "pc1",
          "step": "macros",
          "version": 2,
          "action": "p",
          "byte_length": 47
        },
        {
          "label": "잘 모르겠어요",
          "namespace": "pc1",
          "step": "macros",
          "version": 2,
          "action": "u",
          "byte_length": 47
        }
      ],
      "display_max_columns": 53,
      "contains_later": false,
      "value_free": true
    },
    {
      "state": "previous_navigation",
      "rendered_card": true,
      "receipt_variant": "previous",
      "text": "↩️ 이전 답변을 수정합니다.\n\n진행 2/12\n오늘 아침 체중을 숫자로 입력해 주세요.\n예: [예시 생략]",
      "keyboard": [
        [
          "이전 답 수정",
          "잘 모르겠어요"
        ]
      ],
      "callback_structure": [
        {
          "label": "이전 답 수정",
          "namespace": "pc1",
          "step": "bodyweight",
          "version": 2,
          "action": "p",
          "byte_length": 51
        },
        {
          "label": "잘 모르겠어요",
          "namespace": "pc1",
          "step": "bodyweight",
          "version": 2,
          "action": "u",
          "byte_length": 51
        }
      ],
      "display_max_columns": 38,
      "contains_later": false,
      "value_free": true
    },
    {
      "state": "corrected",
      "rendered_card": true,
      "receipt_variant": "edited",
      "text": "✏️ 수정할 답변을 선택했습니다.\n\n진행 12/12\n오늘 아침 체중을 숫자로 입력해 주세요.\n예: [예시 생략]",
      "keyboard": [
        [
          "이전 답 수정",
          "잘 모르겠어요"
        ]
      ],
      "callback_structure": [
        {
          "label": "이전 답 수정",
          "namespace": "pc1",
          "step": "bodyweight",
          "version": 13,
          "action": "p",
          "byte_length": 52
        },
        {
          "label": "잘 모르겠어요",
          "namespace": "pc1",
          "step": "bodyweight",
          "version": 13,
          "action": "u",
          "byte_length": 52
        }
      ],
      "display_max_columns": 38,
      "contains_later": false,
      "value_free": true
    },
    {
      "state": "summary",
      "rendered_card": true,
      "receipt_variant": "summary",
      "text": "확인 12/12\n입력한 내용은 저장 전 마지막 확인 단계입니다.",
      "keyboard": [
        [
          "저장",
          "수정",
          "임시저장"
        ]
      ],
      "callback_structure": [
        {
          "label": "저장",
          "namespace": "pc1",
          "step": "summary",
          "version": 12,
          "action": "a0",
          "byte_length": 50
        },
        {
          "label": "수정",
          "namespace": "pc1",
          "step": "summary",
          "version": 12,
          "action": "a1",
          "byte_length": 50
        },
        {
          "label": "임시저장",
          "namespace": "pc1",
          "step": "summary",
          "version": 12,
          "action": "a2",
          "byte_length": 50
        }
      ],
      "display_max_columns": 45,
      "contains_later": false,
      "value_free": true
    },
    {
      "state": "terminal",
      "rendered_card": true,
      "receipt_variant": "terminal",
      "text": "✅ 오늘 체크인을 저장했습니다.",
      "keyboard": [],
      "callback_structure": [],
      "display_max_columns": 30,
      "contains_later": false,
      "value_free": true
    },
    {
      "state": "invalid",
      "rendered_card": false,
      "receipt_variant": "invalid",
      "notice": "체크인 버튼 형식이 올바르지 않습니다.",
      "keyboard": [],
      "callback_structure": [],
      "value_free": true,
      "contains_later": false
    },
    {
      "state": "stale",
      "rendered_card": false,
      "receipt_variant": "stale",
      "notice": "이 체크인은 이 토픽의 소유자만 사용할 수 없습니다.",
      "keyboard": [],
      "callback_structure": [],
      "value_free": true,
      "contains_later": false
    },
    {
      "state": "explicit_resume_nutrition_daily",
      "rendered_card": true,
      "receipt_variant": "resume",
      "text": "오늘 체크인 · 약 2~3분\n진행 1/12\n오늘 아침 체중을 숫자로 입력해 주세요.\n예: [예시 생략]",
      "keyboard": [
        [
          "잘 모르겠어요"
        ]
      ],
      "callback_structure": [
        {
          "label": "잘 모르겠어요",
          "namespace": "pc1",
          "step": "bodyweight",
          "version": 0,
          "action": "u",
          "byte_length": 51
        }
      ],
      "display_max_columns": 38,
      "contains_later": false,
      "value_free": true
    }
  ],
  "functional_gates": {
    "exactly_one_value_free_confirmation_plus_next_question_per_accepted_input": true,
    "first_question_unknown_only": true,
    "later_known_and_unknown_controls": true,
    "previous_only_with_valid_history": true,
    "no_later_action": true,
    "no_answer_value_echo": true,
    "distinct_headers": true,
    "progress_2_of_12": true,
    "explicit_resume_nutrition_daily": true,
    "wrong_identity_no_action": true,
    "duplicate_and_recovery_zero": true,
    "terminal_no_buttons": true
  },
  "render_evidence": {
    "text": "task-7-audit-korean-ux-cards.txt",
    "image": "task-7-audit-korean-ux-cards.png",
    "renderer": "Pillow rasterization of fresh actual WizardPrompt text/button rows; synthetic examples redacted at evidence boundary",
    "viewport": {
      "width": 1200,
      "height": 2753
    },
    "signature": "PNG IHDR/RGB validated by Pillow",
    "alpha_channel_intact": false,
    "opaque_background_expected": true,
    "cjk_review": {
      "max_display_columns": 53,
      "overflow_lines": [],
      "clipping_or_tofu": false,
      "button_rows_visible": true
    },
    "file_hashes": {
      "task-7-audit-korean-ux-cards.png": "c9f43d9d7137e296600dec627aa607506c9aac168274b960b39f71041b0283bd",
      "task-7-audit-korean-ux-cards.txt": "f332734230474f1275f96430c3bfe8ef6a9e77d979351ab4fad3d2e1bd6c6963",
      "task-7-audit-korean-ux-tui-check.json": "09f50ddf599704e38098643946e5243fc51c99d40be3c41b0ef5346bde037ab8",
      "task-7-audit-korean-ux-fake-transport.json": "8a2e4e2a5bab5298f5fe792b7431893319477f44dc41a6f48eeffa4baf9b6d46"
    },
    "signature_check": {
      "extension": "png",
      "format": "PNG",
      "mode": "RGB",
      "dimensions": [
        1200,
        2753
      ],
      "fully_composited": true,
      "corner_pixels": "expected light-blue canvas"
    },
    "capture_tooling": "Networkless Pillow with explicit vector receipt icons to avoid font tofu; text/button content is redacted fresh actual WizardPrompt output.",
    "script_evidence": "task-7-audit-korean-ux-tui-check.json"
  },
  "dual_oracle_judgment": {
    "pass_a": {
      "verdict": "PASS",
      "confidence": "HIGH",
      "finding_count": 0,
      "basis": "real shared WizardPrompt/CallbackData renderer and actual bridge state transitions"
    },
    "pass_b": {
      "verdict": "PASS",
      "confidence": "HIGH",
      "finding_count": 0,
      "basis": "fresh redacted raster/text captures inspected for Korean wrapping, clipping, controls, and value echo"
    }
  },
  "source_scope": {
    "bridge": "gateway/platforms/physique_checkin.py",
    "prompt_renderer": "gateway/platforms/physique_checkin_prompts.py",
    "stepper": "gateway/platforms/telegram_physique_checkin_stepper.py",
    "transport": "gateway/platforms/telegram_checkin_stepper_transport.py"
  },
  "privacy": {
    "synthetic_values_retained": false,
    "customer_messages": 0,
    "network_events": 0,
    "raw_callback_payloads_retained": false
  },
  "cleanup": {
    "temporary_driver": "/tmp/task7_render_audit.py",
    "removed": true,
    "temporary_directory_removed": true
  },
  "fake_transport_qa": {
    "evidence": "task-7-audit-korean-ux-fake-transport.json",
    "command": "PYTHONDONTWRITEBYTECODE=1 /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/.venv/bin/python -B /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/run_nutricoach_v150_telegram_stepper_qa.py",
    "cwd": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined",
    "status": "PASS",
    "known_sends1": true,
    "unknown_sends1": true,
    "duplicate_advances0": true,
    "automatic_recovery_sends0": true,
    "polling_unknown_terminal": true,
    "resume_target": "nutrition_daily",
    "network_events": 0,
    "customer_messages": 0
  },
  "verification": {
    "focused_tests": {
      "command": "PYTHONDONTWRITEBYTECODE=1 /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/.venv/bin/python -m pytest -q -p no:cacheprovider tests/gateway/test_customer_nutrition_stepper_card.py tests/gateway/test_telegram_stepper_integration.py",
      "cwd": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined",
      "result": "14 passed",
      "exit_code": 0
    },
    "evidence_hygiene": "PASS: PNG signature/RGB/dimensions/compositing validated; all retained task-7 audit text/JSON outputs omit synthetic values; temporary driver and fixture directories removed"
  }
}
