{
    "success": true,
    "run": {
        "id": 2,
        "workflow_no": "WF-ACC-20260519201534",
        "collection_id": 9,
        "current_step": 7,
        "status": "completed",
        "prompt_preset_id": null,
        "wizard_profile_id": 2,
        "master_artwork_path": "/assets/pod/collections/9/master/master_artwork.png",
        "selected_template_ids_json": "[28,27]",
        "settings_json": "{\"title\":\"Workflow gate acceptance 201534\",\"aspect_ratio\":\"1:1\"}",
        "created_at": "2026-05-19 20:15:34",
        "updated_at": "2026-05-19 20:16:05",
        "meta_json": "{\"gemini_calls\":0,\"export\":{\"success\":true,\"zip_archive_available\":true,\"revision_id\":0,\"zip_path\":\"/var/www/html/assets/pod/collections/9/exports/collection_9_workflow_gate_acceptance_201534_20260519_201603.zip\",\"zip_public_url\":\"/assets/pod/collections/9/exports/collection_9_workflow_gate_acceptance_201534_20260519_201603.zip\",\"manifest_path\":\"/assets/pod/collections/9/exports/collection_9_workflow_gate_acceptance_201534_20260519_201603_manifest.json\",\"file_count\":13,\"missing_count\":0,\"warnings\":[],\"manifest\":{\"collection_id\":9,\"collection_no\":\"COL-20260519201535-7228ca\",\"title\":\"Workflow gate acceptance 201534\",\"created_at\":\"2026-05-19 20:15:35\",\"exported_at\":\"2026-05-19T20:16:02+00:00\",\"revision\":{\"revision_id\":0,\"revision_no\":0,\"revision_label\":\"\",\"is_active\":false},\"master\":{\"artwork\":{\"role\":\"master_artwork\",\"public_path\":\"/assets/pod/collections/9/master/master_artwork.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/master/master_artwork.png\",\"zip_entry\":\"master/master_artwork.png\",\"exists\":true,\"size_bytes\":42405},\"print\":{\"role\":\"master_print\",\"public_path\":\"/assets/pod/collections/9/master/master_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/master/master_print.png\",\"zip_entry\":\"master/master_print.png\",\"exists\":true,\"size_bytes\":244750}},\"items\":[{\"item_id\":22,\"template_id\":28,\"template_name\":\"硬式洗漱墊\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_22_mockup\",\"public_path\":\"/assets/pod/collections/9/mockups/item_22_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/mockups/item_22_mockup.png\",\"zip_entry\":\"items/item_22_template_28/mockup.png\",\"exists\":true,\"size_bytes\":69989},\"print\":{\"role\":\"item_22_print\",\"public_path\":\"/assets/pod/collections/9/prints/item_22_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/prints/item_22_print.png\",\"zip_entry\":\"items/item_22_template_28/print.png\",\"exists\":true,\"size_bytes\":244750},\"panel_prints\":[]},{\"item_id\":23,\"template_id\":27,\"template_name\":\"硬式杯墊(圓型)\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_23_mockup\",\"public_path\":\"/assets/pod/collections/9/mockups/item_23_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/mockups/item_23_mockup.png\",\"zip_entry\":\"items/item_23_template_27/mockup.png\",\"exists\":true,\"size_bytes\":82260},\"print\":{\"role\":\"item_23_print\",\"public_path\":\"/assets/pod/collections/9/prints/item_23_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/prints/item_23_print.png\",\"zip_entry\":\"items/item_23_template_27/print.png\",\"exists\":true,\"size_bytes\":244750},\"panel_prints\":[]}],\"warnings\":[],\"summary\":{\"item_count\":2,\"file_count\":11,\"missing_count\":0,\"gemini_calls\":0,\"api_cost_saved\":\"Applied 2 products with 0 Gemini calls.\"},\"spec_files\":{\"html\":{\"role\":\"production_spec_html\",\"public_path\":\"/assets/pod/collections/9/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_spec.html\",\"zip_entry\":\"production_spec.html\",\"exists\":true,\"size_bytes\":2854},\"csv\":{\"role\":\"production_spec_csv\",\"public_path\":\"/assets/pod/collections/9/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_spec.csv\",\"zip_entry\":\"production_spec.csv\",\"exists\":true,\"size_bytes\":1239},\"json\":{\"role\":\"production_manifest_json\",\"public_path\":\"/assets/pod/collections/9/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_manifest.json\",\"zip_entry\":\"production_manifest.json\",\"exists\":true,\"size_bytes\":4351}},\"preflight_files\":{\"html\":{\"role\":\"preflight_report_html\",\"public_path\":\"/assets/pod/collections/9/preflight/preflight_report.html\",\"local_path\":\"/var/www/html/assets/pod/collections/9/preflight/preflight_report.html\",\"zip_entry\":\"preflight_report.html\",\"exists\":true,\"size_bytes\":13151},\"json\":{\"role\":\"preflight_report_json\",\"public_path\":\"/assets/pod/collections/9/preflight/preflight_report.json\",\"local_path\":\"/var/www/html/assets/pod/collections/9/preflight/preflight_report.json\",\"zip_entry\":\"preflight_report.json\",\"exists\":true,\"size_bytes\":16323}},\"preflight\":{\"status\":\"fail\",\"score\":20,\"warning_count\":0,\"fail_count\":8,\"html\":\"preflight_report.html\",\"json\":\"preflight_report.json\"}}}}",
        "step_status_json": null,
        "step_gate_json": "{\"export_override\":{\"active\":true,\"reason\":\"acceptance dry-run override\",\"at\":\"2026-05-19T20:16:00+00:00\"}}",
        "last_error": null,
        "completed_at": "2026-05-19 20:16:05",
        "copied_from_run_id": null
    },
    "steps": {
        "1": {
            "step_no": 1,
            "step_key": "prompt",
            "label": "Prompt",
            "status": "pass",
            "score": null,
            "message": "Acceptance prompt/profile selected."
        },
        "2": {
            "step_no": 2,
            "step_key": "master_artwork",
            "label": "Master Artwork",
            "status": "pass",
            "score": null,
            "message": "Master artwork exists."
        },
        "3": {
            "step_no": 3,
            "step_key": "templates",
            "label": "Templates",
            "status": "pass",
            "score": null,
            "message": "2 templates selected."
        },
        "4": {
            "step_no": 4,
            "step_key": "apply_items",
            "label": "Apply Items",
            "status": "pass",
            "score": null,
            "message": "2 items applied."
        },
        "5": {
            "step_no": 5,
            "step_key": "preflight",
            "label": "Preflight",
            "status": "fail",
            "score": 20,
            "message": "Preflight fail / score 20"
        },
        "6": {
            "step_no": 6,
            "step_key": "export_zip",
            "label": "Export ZIP",
            "status": "pass",
            "score": null,
            "message": "ZIP export exists."
        },
        "7": {
            "step_no": 7,
            "step_key": "delivery_ready",
            "label": "Delivery Ready",
            "status": "pass",
            "score": null,
            "message": "Workflow completed."
        }
    },
    "events": [
        {
            "id": 10,
            "run_id": 2,
            "event_type": "cloned",
            "message": "Workflow cloned as #3",
            "meta_json": "{\"new_run_id\":3}",
            "created_at": "2026-05-19 20:16:05"
        },
        {
            "id": 8,
            "run_id": 2,
            "event_type": "step_pass",
            "message": "Step 7 delivery_ready: Workflow completed.",
            "meta_json": "{\"export\":{\"success\":true,\"zip_archive_available\":true,\"revision_id\":0,\"zip_path\":\"/var/www/html/assets/pod/collections/9/exports/collection_9_workflow_gate_acceptance_201534_20260519_201603.zip\",\"zip_public_url\":\"/assets/pod/collections/9/exports/collection_9_workflow_gate_acceptance_201534_20260519_201603.zip\",\"manifest_path\":\"/assets/pod/collections/9/exports/collection_9_workflow_gate_acceptance_201534_20260519_201603_manifest.json\",\"file_count\":13,\"missing_count\":0,\"warnings\":[],\"manifest\":{\"collection_id\":9,\"collection_no\":\"COL-20260519201535-7228ca\",\"title\":\"Workflow gate acceptance 201534\",\"created_at\":\"2026-05-19 20:15:35\",\"exported_at\":\"2026-05-19T20:16:02+00:00\",\"revision\":{\"revision_id\":0,\"revision_no\":0,\"revision_label\":\"\",\"is_active\":false},\"master\":{\"artwork\":{\"role\":\"master_artwork\",\"public_path\":\"/assets/pod/collections/9/master/master_artwork.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/master/master_artwork.png\",\"zip_entry\":\"master/master_artwork.png\",\"exists\":true,\"size_bytes\":42405},\"print\":{\"role\":\"master_print\",\"public_path\":\"/assets/pod/collections/9/master/master_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/master/master_print.png\",\"zip_entry\":\"master/master_print.png\",\"exists\":true,\"size_bytes\":244750}},\"items\":[{\"item_id\":22,\"template_id\":28,\"template_name\":\"硬式洗漱墊\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_22_mockup\",\"public_path\":\"/assets/pod/collections/9/mockups/item_22_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/mockups/item_22_mockup.png\",\"zip_entry\":\"items/item_22_template_28/mockup.png\",\"exists\":true,\"size_bytes\":69989},\"print\":{\"role\":\"item_22_print\",\"public_path\":\"/assets/pod/collections/9/prints/item_22_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/prints/item_22_print.png\",\"zip_entry\":\"items/item_22_template_28/print.png\",\"exists\":true,\"size_bytes\":244750},\"panel_prints\":[]},{\"item_id\":23,\"template_id\":27,\"template_name\":\"硬式杯墊(圓型)\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_23_mockup\",\"public_path\":\"/assets/pod/collections/9/mockups/item_23_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/mockups/item_23_mockup.png\",\"zip_entry\":\"items/item_23_template_27/mockup.png\",\"exists\":true,\"size_bytes\":82260},\"print\":{\"role\":\"item_23_print\",\"public_path\":\"/assets/pod/collections/9/prints/item_23_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/prints/item_23_print.png\",\"zip_entry\":\"items/item_23_template_27/print.png\",\"exists\":true,\"size_bytes\":244750},\"panel_prints\":[]}],\"warnings\":[],\"summary\":{\"item_count\":2,\"file_count\":11,\"missing_count\":0,\"gemini_calls\":0,\"api_cost_saved\":\"Applied 2 products with 0 Gemini calls.\"},\"spec_files\":{\"html\":{\"role\":\"production_spec_html\",\"public_path\":\"/assets/pod/collections/9/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_spec.html\",\"zip_entry\":\"production_spec.html\",\"exists\":true,\"size_bytes\":2854},\"csv\":{\"role\":\"production_spec_csv\",\"public_path\":\"/assets/pod/collections/9/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_spec.csv\",\"zip_entry\":\"production_spec.csv\",\"exists\":true,\"size_bytes\":1239},\"json\":{\"role\":\"production_manifest_json\",\"public_path\":\"/assets/pod/collections/9/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_manifest.json\",\"zip_entry\":\"production_manifest.json\",\"exists\":true,\"size_bytes\":4351}},\"preflight_files\":{\"html\":{\"role\":\"preflight_report_html\",\"public_path\":\"/assets/pod/collections/9/preflight/preflight_report.html\",\"local_path\":\"/var/www/html/assets/pod/collections/9/preflight/preflight_report.html\",\"zip_entry\":\"preflight_report.html\",\"exists\":true,\"size_bytes\":13151},\"json\":{\"role\":\"preflight_report_json\",\"public_path\":\"/assets/pod/collections/9/preflight/preflight_report.json\",\"local_path\":\"/var/www/html/assets/pod/collections/9/preflight/preflight_report.json\",\"zip_entry\":\"preflight_report.json\",\"exists\":true,\"size_bytes\":16323}},\"preflight\":{\"status\":\"fail\",\"score\":20,\"warning_count\":0,\"fail_count\":8,\"html\":\"preflight_report.html\",\"json\":\"preflight_report.json\"}}}}",
            "created_at": "2026-05-19 20:16:05"
        },
        {
            "id": 7,
            "run_id": 2,
            "event_type": "step_pass",
            "message": "Step 6 export_zip: ZIP export generated.",
            "meta_json": "{\"export\":{\"success\":true,\"zip_archive_available\":true,\"revision_id\":0,\"zip_path\":\"/var/www/html/assets/pod/collections/9/exports/collection_9_workflow_gate_acceptance_201534_20260519_201603.zip\",\"zip_public_url\":\"/assets/pod/collections/9/exports/collection_9_workflow_gate_acceptance_201534_20260519_201603.zip\",\"manifest_path\":\"/assets/pod/collections/9/exports/collection_9_workflow_gate_acceptance_201534_20260519_201603_manifest.json\",\"file_count\":13,\"missing_count\":0,\"warnings\":[],\"manifest\":{\"collection_id\":9,\"collection_no\":\"COL-20260519201535-7228ca\",\"title\":\"Workflow gate acceptance 201534\",\"created_at\":\"2026-05-19 20:15:35\",\"exported_at\":\"2026-05-19T20:16:02+00:00\",\"revision\":{\"revision_id\":0,\"revision_no\":0,\"revision_label\":\"\",\"is_active\":false},\"master\":{\"artwork\":{\"role\":\"master_artwork\",\"public_path\":\"/assets/pod/collections/9/master/master_artwork.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/master/master_artwork.png\",\"zip_entry\":\"master/master_artwork.png\",\"exists\":true,\"size_bytes\":42405},\"print\":{\"role\":\"master_print\",\"public_path\":\"/assets/pod/collections/9/master/master_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/master/master_print.png\",\"zip_entry\":\"master/master_print.png\",\"exists\":true,\"size_bytes\":244750}},\"items\":[{\"item_id\":22,\"template_id\":28,\"template_name\":\"硬式洗漱墊\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_22_mockup\",\"public_path\":\"/assets/pod/collections/9/mockups/item_22_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/mockups/item_22_mockup.png\",\"zip_entry\":\"items/item_22_template_28/mockup.png\",\"exists\":true,\"size_bytes\":69989},\"print\":{\"role\":\"item_22_print\",\"public_path\":\"/assets/pod/collections/9/prints/item_22_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/prints/item_22_print.png\",\"zip_entry\":\"items/item_22_template_28/print.png\",\"exists\":true,\"size_bytes\":244750},\"panel_prints\":[]},{\"item_id\":23,\"template_id\":27,\"template_name\":\"硬式杯墊(圓型)\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_23_mockup\",\"public_path\":\"/assets/pod/collections/9/mockups/item_23_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/mockups/item_23_mockup.png\",\"zip_entry\":\"items/item_23_template_27/mockup.png\",\"exists\":true,\"size_bytes\":82260},\"print\":{\"role\":\"item_23_print\",\"public_path\":\"/assets/pod/collections/9/prints/item_23_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/prints/item_23_print.png\",\"zip_entry\":\"items/item_23_template_27/print.png\",\"exists\":true,\"size_bytes\":244750},\"panel_prints\":[]}],\"warnings\":[],\"summary\":{\"item_count\":2,\"file_count\":11,\"missing_count\":0,\"gemini_calls\":0,\"api_cost_saved\":\"Applied 2 products with 0 Gemini calls.\"},\"spec_files\":{\"html\":{\"role\":\"production_spec_html\",\"public_path\":\"/assets/pod/collections/9/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_spec.html\",\"zip_entry\":\"production_spec.html\",\"exists\":true,\"size_bytes\":2854},\"csv\":{\"role\":\"production_spec_csv\",\"public_path\":\"/assets/pod/collections/9/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_spec.csv\",\"zip_entry\":\"production_spec.csv\",\"exists\":true,\"size_bytes\":1239},\"json\":{\"role\":\"production_manifest_json\",\"public_path\":\"/assets/pod/collections/9/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_manifest.json\",\"zip_entry\":\"production_manifest.json\",\"exists\":true,\"size_bytes\":4351}},\"preflight_files\":{\"html\":{\"role\":\"preflight_report_html\",\"public_path\":\"/assets/pod/collections/9/preflight/preflight_report.html\",\"local_path\":\"/var/www/html/assets/pod/collections/9/preflight/preflight_report.html\",\"zip_entry\":\"preflight_report.html\",\"exists\":true,\"size_bytes\":13151},\"json\":{\"role\":\"preflight_report_json\",\"public_path\":\"/assets/pod/collections/9/preflight/preflight_report.json\",\"local_path\":\"/var/www/html/assets/pod/collections/9/preflight/preflight_report.json\",\"zip_entry\":\"preflight_report.json\",\"exists\":true,\"size_bytes\":16323}},\"preflight\":{\"status\":\"fail\",\"score\":20,\"warning_count\":0,\"fail_count\":8,\"html\":\"preflight_report.html\",\"json\":\"preflight_report.json\"}}}}",
            "created_at": "2026-05-19 20:16:04"
        },
        {
            "id": 6,
            "run_id": 2,
            "event_type": "admin_override",
            "message": "Admin override enabled for export gate.",
            "meta_json": "{\"reason\":\"acceptance dry-run override\"}",
            "created_at": "2026-05-19 20:16:00"
        },
        {
            "id": 5,
            "run_id": 2,
            "event_type": "step_fail",
            "message": "Step 5 preflight: Preflight fail / score 0",
            "meta_json": "{\"score\":0,\"report\":{\"collection_id\":9,\"revision_id\":0,\"revision_no\":0,\"status\":\"fail\",\"score\":0,\"summary\":{\"pass\":25,\"warning\":0,\"fail\":13},\"checks\":[{\"code\":\"collection_exists\",\"level\":\"pass\",\"message\":\"Collection exists\",\"path\":\"\",\"details\":{\"collection_id\":9}},{\"code\":\"collection_has_title\",\"level\":\"pass\",\"message\":\"Collection title exists\",\"path\":\"\",\"details\":[]},{\"code\":\"master_artwork_path_exists\",\"level\":\"pass\",\"message\":\"Master artwork exists\",\"path\":\"/assets/pod/collections/9/master/master_artwork.png\",\"details\":{\"public_path\":\"/assets/pod/collections/9/master/master_artwork.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/master/master_artwork.png\",\"exists\":true,\"size_bytes\":42405,\"width\":1400,\"height\":1400,\"mime\":\"image/png\"}},{\"code\":\"master_print_path_exists\",\"level\":\"pass\",\"message\":\"Master print exists\",\"path\":\"/assets/pod/collections/9/master/master_print.png\",\"details\":{\"public_path\":\"/assets/pod/collections/9/master/master_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/master/master_print.png\",\"exists\":true,\"size_bytes\":244750,\"width\":3000,\"height\":3000,\"mime\":\"image/png\"}},{\"code\":\"collection_has_items\",\"level\":\"pass\",\"message\":\"Collection has items\",\"path\":\"\",\"details\":{\"item_count\":2}},{\"code\":\"item_has_template_id\",\"level\":\"pass\",\"message\":\"Item 22 template_id check\",\"path\":\"\",\"details\":{\"item_id\":22,\"template_id\":28}},{\"code\":\"item_has_apply_mode\",\"level\":\"pass\",\"message\":\"Item 22 apply_mode check\",\"path\":\"\",\"details\":{\"item_id\":22,\"apply_mode\":\"tile-cover\"}},{\"code\":\"item_mockup_exists\",\"level\":\"pass\",\"message\":\"Item mockup exists\",\"path\":\"/assets/pod/collections/9/mockups/item_22_mockup.png\",\"details\":{\"item_id\":22,\"public_path\":\"/assets/pod/collections/9/mockups/item_22_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/mockups/item_22_mockup.png\",\"exists\":true,\"size_bytes\":69989,\"width\":1000,\"height\":472,\"mime\":\"image/png\"}},{\"code\":\"item_print_exists\",\"level\":\"pass\",\"message\":\"Item print exists\",\"path\":\"/assets/pod/collections/9/prints/item_22_print.png\",\"details\":{\"item_id\":22,\"public_path\":\"/assets/pod/collections/9/prints/item_22_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/prints/item_22_print.png\",\"exists\":true,\"size_bytes\":244750,\"width\":3000,\"height\":3000,\"mime\":\"image/png\"}},{\"code\":\"mockup_and_print_are_not_same_role\",\"level\":\"pass\",\"message\":\"Mockup and print paths are distinct\",\"path\":\"\",\"details\":{\"item_id\":22}},{\"code\":\"print_file_is_png_or_supported\",\"level\":\"pass\",\"message\":\"Print file extension is supported\",\"path\":\"/assets/pod/collections/9/prints/item_22_print.png\",\"details\":{\"item_id\":22,\"mime\":\"image/png\"}},{\"code\":\"image_dimensions_readable\",\"level\":\"pass\",\"message\":\"Image dimensions readable\",\"path\":\"/assets/pod/collections/9/prints/item_22_print.png\",\"details\":{\"item_id\":22,\"width\":3000,\"height\":3000}},{\"code\":\"image_min_size\",\"level\":\"pass\",\"message\":\"Print image size is acceptable\",\"path\":\"/assets/pod/collections/9/prints/item_22_print.png\",\"details\":{\"item_id\":22,\"width\":3000,\"height\":3000}},{\"code\":\"public_url_resolvable\",\"level\":\"pass\",\"message\":\"Public path resolves to local file\",\"path\":\"/assets/pod/collections/9/prints/item_22_print.png\",\"details\":{\"item_id\":22}},{\"code\":\"item_has_template_id\",\"level\":\"pass\",\"message\":\"Item 23 template_id check\",\"path\":\"\",\"details\":{\"item_id\":23,\"template_id\":27}},{\"code\":\"item_has_apply_mode\",\"level\":\"pass\",\"message\":\"Item 23 apply_mode check\",\"path\":\"\",\"details\":{\"item_id\":23,\"apply_mode\":\"tile-cover\"}},{\"code\":\"item_mockup_exists\",\"level\":\"pass\",\"message\":\"Item mockup exists\",\"path\":\"/assets/pod/collections/9/mockups/item_23_mockup.png\",\"details\":{\"item_id\":23,\"public_path\":\"/assets/pod/collections/9/mockups/item_23_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/mockups/item_23_mockup.png\",\"exists\":true,\"size_bytes\":82260,\"width\":371,\"height\":369,\"mime\":\"image/png\"}},{\"code\":\"item_print_exists\",\"level\":\"pass\",\"message\":\"Item print exists\",\"path\":\"/assets/pod/collections/9/prints/item_23_print.png\",\"details\":{\"item_id\":23,\"public_path\":\"/assets/pod/collections/9/prints/item_23_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/9/prints/item_23_print.png\",\"exists\":true,\"size_bytes\":244750,\"width\":3000,\"height\":3000,\"mime\":\"image/png\"}},{\"code\":\"mockup_and_print_are_not_same_role\",\"level\":\"pass\",\"message\":\"Mockup and print paths are distinct\",\"path\":\"\",\"details\":{\"item_id\":23}},{\"code\":\"print_file_is_png_or_supported\",\"level\":\"pass\",\"message\":\"Print file extension is supported\",\"path\":\"/assets/pod/collections/9/prints/item_23_print.png\",\"details\":{\"item_id\":23,\"mime\":\"image/png\"}},{\"code\":\"image_dimensions_readable\",\"level\":\"pass\",\"message\":\"Image dimensions readable\",\"path\":\"/assets/pod/collections/9/prints/item_23_print.png\",\"details\":{\"item_id\":23,\"width\":3000,\"height\":3000}},{\"code\":\"image_min_size\",\"level\":\"pass\",\"message\":\"Print image size is acceptable\",\"path\":\"/assets/pod/collections/9/prints/item_23_print.png\",\"details\":{\"item_id\":23,\"width\":3000,\"height\":3000}},{\"code\":\"public_url_resolvable\",\"level\":\"pass\",\"message\":\"Public path resolves to local file\",\"path\":\"/assets/pod/collections/9/prints/item_23_print.png\",\"details\":{\"item_id\":23}},{\"code\":\"collection_items_completed\",\"level\":\"pass\",\"message\":\"All collection items completed\",\"path\":\"\",\"details\":[]},{\"code\":\"latest_zip_exists\",\"level\":\"fail\",\"message\":\"Latest ZIP missing\",\"path\":\"\",\"details\":[]},{\"code\":\"zip_size_gt_zero\",\"level\":\"fail\",\"message\":\"ZIP size is zero or unavailable\",\"path\":\"\",\"details\":{\"size_bytes\":0}},{\"code\":\"manifest_exists\",\"level\":\"fail\",\"message\":\"Export manifest missing\",\"path\":\"\",\"details\":{\"public_path\":\"\",\"local_path\":\"\",\"exists\":false,\"size_bytes\":0,\"width\":null,\"height\":null,\"mime\":\"\"}},{\"code\":\"zip_contains_manifest_json\",\"level\":\"fail\",\"message\":\"ZIP missing manifest.json\",\"path\":\"\",\"details\":{\"entry\":\"manifest.json\"}},{\"code\":\"zip_contains_readme\",\"level\":\"fail\",\"message\":\"ZIP missing README.txt\",\"path\":\"\",\"details\":{\"entry\":\"README.txt\"}},{\"code\":\"zip_contains_production_spec_html\",\"level\":\"fail\",\"message\":\"ZIP missing production_spec.html\",\"path\":\"\",\"details\":{\"entry\":\"production_spec.html\"}},{\"code\":\"zip_contains_production_spec_csv\",\"level\":\"fail\",\"message\":\"ZIP missing production_spec.csv\",\"path\":\"\",\"details\":{\"entry\":\"production_spec.csv\"}},{\"code\":\"zip_contains_production_manifest_json\",\"level\":\"fail\",\"message\":\"ZIP missing production_manifest.json\",\"path\":\"\",\"details\":{\"entry\":\"production_manifest.json\"}},{\"code\":\"zip_contains_panel_prints_if_multi_panel\",\"level\":\"pass\",\"message\":\"No multi-panel item requires panel ZIP entries\",\"path\":\"\",\"details\":[]},{\"code\":\"production_spec_html_exists\",\"level\":\"fail\",\"message\":\"Production spec HTML missing\",\"path\":\"/assets/pod/collections/9/specs/production_spec.html\",\"details\":{\"public_path\":\"/assets/pod/collections/9/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_spec.html\",\"exists\":false,\"size_bytes\":0,\"width\":null,\"height\":null,\"mime\":\"\"}},{\"code\":\"production_spec_csv_exists\",\"level\":\"fail\",\"message\":\"Production spec CSV missing\",\"path\":\"/assets/pod/collections/9/specs/production_spec.csv\",\"details\":{\"public_path\":\"/assets/pod/collections/9/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_spec.csv\",\"exists\":false,\"size_bytes\":0,\"width\":null,\"height\":null,\"mime\":\"\"}},{\"code\":\"production_manifest_json_exists\",\"level\":\"fail\",\"message\":\"Production manifest JSON missing\",\"path\":\"/assets/pod/collections/9/specs/production_manifest.json\",\"details\":{\"public_path\":\"/assets/pod/collections/9/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_manifest.json\",\"exists\":false,\"size_bytes\":0,\"width\":null,\"height\":null,\"mime\":\"\"}},{\"code\":\"production_manifest_json_parseable\",\"level\":\"fail\",\"message\":\"Production manifest JSON parse failed\",\"path\":\"/assets/pod/collections/9/specs/production_manifest.json\",\"details\":[]},{\"code\":\"csv_has_rows\",\"level\":\"fail\",\"message\":\"CSV has no data rows\",\"path\":\"/assets/pod/collections/9/specs/production_spec.csv\",\"details\":{\"rows\":0}}],\"warnings\":[],\"failures\":[{\"code\":\"latest_zip_exists\",\"level\":\"fail\",\"message\":\"Latest ZIP missing\",\"path\":\"\",\"details\":[]},{\"code\":\"zip_size_gt_zero\",\"level\":\"fail\",\"message\":\"ZIP size is zero or unavailable\",\"path\":\"\",\"details\":{\"size_bytes\":0}},{\"code\":\"manifest_exists\",\"level\":\"fail\",\"message\":\"Export manifest missing\",\"path\":\"\",\"details\":{\"public_path\":\"\",\"local_path\":\"\",\"exists\":false,\"size_bytes\":0,\"width\":null,\"height\":null,\"mime\":\"\"}},{\"code\":\"zip_contains_manifest_json\",\"level\":\"fail\",\"message\":\"ZIP missing manifest.json\",\"path\":\"\",\"details\":{\"entry\":\"manifest.json\"}},{\"code\":\"zip_contains_readme\",\"level\":\"fail\",\"message\":\"ZIP missing README.txt\",\"path\":\"\",\"details\":{\"entry\":\"README.txt\"}},{\"code\":\"zip_contains_production_spec_html\",\"level\":\"fail\",\"message\":\"ZIP missing production_spec.html\",\"path\":\"\",\"details\":{\"entry\":\"production_spec.html\"}},{\"code\":\"zip_contains_production_spec_csv\",\"level\":\"fail\",\"message\":\"ZIP missing production_spec.csv\",\"path\":\"\",\"details\":{\"entry\":\"production_spec.csv\"}},{\"code\":\"zip_contains_production_manifest_json\",\"level\":\"fail\",\"message\":\"ZIP missing production_manifest.json\",\"path\":\"\",\"details\":{\"entry\":\"production_manifest.json\"}},{\"code\":\"production_spec_html_exists\",\"level\":\"fail\",\"message\":\"Production spec HTML missing\",\"path\":\"/assets/pod/collections/9/specs/production_spec.html\",\"details\":{\"public_path\":\"/assets/pod/collections/9/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_spec.html\",\"exists\":false,\"size_bytes\":0,\"width\":null,\"height\":null,\"mime\":\"\"}},{\"code\":\"production_spec_csv_exists\",\"level\":\"fail\",\"message\":\"Production spec CSV missing\",\"path\":\"/assets/pod/collections/9/specs/production_spec.csv\",\"details\":{\"public_path\":\"/assets/pod/collections/9/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_spec.csv\",\"exists\":false,\"size_bytes\":0,\"width\":null,\"height\":null,\"mime\":\"\"}},{\"code\":\"production_manifest_json_exists\",\"level\":\"fail\",\"message\":\"Production manifest JSON missing\",\"path\":\"/assets/pod/collections/9/specs/production_manifest.json\",\"details\":{\"public_path\":\"/assets/pod/collections/9/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/9/specs/production_manifest.json\",\"exists\":false,\"size_bytes\":0,\"width\":null,\"height\":null,\"mime\":\"\"}},{\"code\":\"production_manifest_json_parseable\",\"level\":\"fail\",\"message\":\"Production manifest JSON parse failed\",\"path\":\"/assets/pod/collections/9/specs/production_manifest.json\",\"details\":[]},{\"code\":\"csv_has_rows\",\"level\":\"fail\",\"message\":\"CSV has no data rows\",\"path\":\"/assets/pod/collections/9/specs/production_spec.csv\",\"details\":{\"rows\":0}}],\"generated_at\":\"2026-05-19T20:15:59+00:00\"}}",
            "created_at": "2026-05-19 20:16:00"
        },
        {
            "id": 4,
            "run_id": 2,
            "event_type": "step_pass",
            "message": "Step 4 apply_items: Applied 2 items.",
            "meta_json": "{\"results\":[{\"item_id\":22,\"template_id\":28,\"apply_mode\":\"tile-cover\",\"mockup_path\":\"/assets/pod/collections/9/mockups/item_22_mockup.png\",\"print_path\":\"/assets/pod/collections/9/prints/item_22_print.png\",\"panels\":[],\"meta\":{\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"template_id\":28,\"template_name\":\"硬式洗漱墊\",\"mask_used\":true,\"panel_zone_missing\":false,\"print_debug\":{\"engine\":\"php_gd\",\"source_size\":[1400,1400],\"output_size\":[3000,3000],\"dpi\":300,\"mode\":\"cover\",\"full_bleed\":true,\"source_empty\":false,\"content_bbox\":{\"x\":0,\"y\":0,\"w\":1400,\"h\":1400},\"content_ratio\":1,\"output_exists\":true},\"compose_debug\":{\"engine\":\"php_gd\",\"mask_used\":true,\"bbox\":{\"x\":48,\"y\":34,\"w\":901,\"h\":378},\"zone\":{\"x\":48,\"y\":34,\"w\":901,\"h\":378},\"output_exists\":true,\"preview_exists\":true},\"gemini_calls\":0}},{\"item_id\":23,\"template_id\":27,\"apply_mode\":\"tile-cover\",\"mockup_path\":\"/assets/pod/collections/9/mockups/item_23_mockup.png\",\"print_path\":\"/assets/pod/collections/9/prints/item_23_print.png\",\"panels\":[],\"meta\":{\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"template_id\":27,\"template_name\":\"硬式杯墊(圓型)\",\"mask_used\":true,\"panel_zone_missing\":false,\"print_debug\":{\"engine\":\"php_gd\",\"source_size\":[1400,1400],\"output_size\":[3000,3000],\"dpi\":300,\"mode\":\"cover\",\"full_bleed\":true,\"source_empty\":false,\"content_bbox\":{\"x\":0,\"y\":0,\"w\":1400,\"h\":1400},\"content_ratio\":1,\"output_exists\":true},\"compose_debug\":{\"engine\":\"php_gd\",\"mask_used\":true,\"bbox\":{\"x\":36,\"y\":34,\"w\":298,\"h\":298},\"zone\":{\"x\":36,\"y\":34,\"w\":298,\"h\":298},\"output_exists\":true,\"preview_exists\":true},\"gemini_calls\":0}}]}",
            "created_at": "2026-05-19 20:15:59"
        },
        {
            "id": 3,
            "run_id": 2,
            "event_type": "step_pass",
            "message": "Step 3 templates: 2 templates selected.",
            "meta_json": "{\"template_ids\":[28,27]}",
            "created_at": "2026-05-19 20:15:42"
        },
        {
            "id": 2,
            "run_id": 2,
            "event_type": "step_pass",
            "message": "Step 2 master_artwork: Master artwork ready.",
            "meta_json": "{\"master_artwork_path\":\"/assets/pod/collections/9/master/master_artwork.png\"}",
            "created_at": "2026-05-19 20:15:42"
        },
        {
            "id": 1,
            "run_id": 2,
            "event_type": "step_pass",
            "message": "Step 1 prompt: Acceptance prompt/profile selected.",
            "meta_json": "{\"settings\":{\"title\":\"Workflow gate acceptance 201534\",\"aspect_ratio\":\"1:1\"}}",
            "created_at": "2026-05-19 20:15:35"
        }
    ]
}