{
    "success": true,
    "run": {
        "id": 4,
        "workflow_no": "WF-ACC-20260519201755",
        "collection_id": 10,
        "current_step": 7,
        "status": "completed",
        "prompt_preset_id": null,
        "wizard_profile_id": 2,
        "master_artwork_path": "/assets/pod/collections/10/master/master_artwork.png",
        "selected_template_ids_json": "[28,27]",
        "settings_json": "{\"title\":\"Workflow gate acceptance 201755\",\"aspect_ratio\":\"1:1\"}",
        "created_at": "2026-05-19 20:17:55",
        "updated_at": "2026-05-19 20:18:24",
        "meta_json": "{\"gemini_calls\":0,\"export\":{\"success\":true,\"zip_archive_available\":true,\"revision_id\":0,\"zip_path\":\"/var/www/html/assets/pod/collections/10/exports/collection_10_workflow_gate_acceptance_201755_20260519_201823.zip\",\"zip_public_url\":\"/assets/pod/collections/10/exports/collection_10_workflow_gate_acceptance_201755_20260519_201823.zip\",\"manifest_path\":\"/assets/pod/collections/10/exports/collection_10_workflow_gate_acceptance_201755_20260519_201823_manifest.json\",\"file_count\":13,\"missing_count\":0,\"warnings\":[],\"manifest\":{\"collection_id\":10,\"collection_no\":\"COL-20260519201755-05179f\",\"title\":\"Workflow gate acceptance 201755\",\"created_at\":\"2026-05-19 20:17:55\",\"exported_at\":\"2026-05-19T20:18:22+00:00\",\"revision\":{\"revision_id\":0,\"revision_no\":0,\"revision_label\":\"\",\"is_active\":false},\"master\":{\"artwork\":{\"role\":\"master_artwork\",\"public_path\":\"/assets/pod/collections/10/master/master_artwork.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/master/master_artwork.png\",\"zip_entry\":\"master/master_artwork.png\",\"exists\":true,\"size_bytes\":42379},\"print\":{\"role\":\"master_print\",\"public_path\":\"/assets/pod/collections/10/master/master_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/master/master_print.png\",\"zip_entry\":\"master/master_print.png\",\"exists\":true,\"size_bytes\":244535}},\"items\":[{\"item_id\":24,\"template_id\":28,\"template_name\":\"硬式洗漱墊\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_24_mockup\",\"public_path\":\"/assets/pod/collections/10/mockups/item_24_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/mockups/item_24_mockup.png\",\"zip_entry\":\"items/item_24_template_28/mockup.png\",\"exists\":true,\"size_bytes\":69989},\"print\":{\"role\":\"item_24_print\",\"public_path\":\"/assets/pod/collections/10/prints/item_24_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/prints/item_24_print.png\",\"zip_entry\":\"items/item_24_template_28/print.png\",\"exists\":true,\"size_bytes\":244535},\"panel_prints\":[]},{\"item_id\":25,\"template_id\":27,\"template_name\":\"硬式杯墊(圓型)\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_25_mockup\",\"public_path\":\"/assets/pod/collections/10/mockups/item_25_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/mockups/item_25_mockup.png\",\"zip_entry\":\"items/item_25_template_27/mockup.png\",\"exists\":true,\"size_bytes\":82260},\"print\":{\"role\":\"item_25_print\",\"public_path\":\"/assets/pod/collections/10/prints/item_25_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/prints/item_25_print.png\",\"zip_entry\":\"items/item_25_template_27/print.png\",\"exists\":true,\"size_bytes\":244535},\"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/10/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/10/specs/production_spec.html\",\"zip_entry\":\"production_spec.html\",\"exists\":true,\"size_bytes\":2861},\"csv\":{\"role\":\"production_spec_csv\",\"public_path\":\"/assets/pod/collections/10/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/10/specs/production_spec.csv\",\"zip_entry\":\"production_spec.csv\",\"exists\":true,\"size_bytes\":1251},\"json\":{\"role\":\"production_manifest_json\",\"public_path\":\"/assets/pod/collections/10/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/10/specs/production_manifest.json\",\"zip_entry\":\"production_manifest.json\",\"exists\":true,\"size_bytes\":4370}},\"preflight_files\":{\"html\":{\"role\":\"preflight_report_html\",\"public_path\":\"/assets/pod/collections/10/preflight/preflight_report.html\",\"local_path\":\"/var/www/html/assets/pod/collections/10/preflight/preflight_report.html\",\"zip_entry\":\"preflight_report.html\",\"exists\":true,\"size_bytes\":13190},\"json\":{\"role\":\"preflight_report_json\",\"public_path\":\"/assets/pod/collections/10/preflight/preflight_report.json\",\"local_path\":\"/var/www/html/assets/pod/collections/10/preflight/preflight_report.json\",\"zip_entry\":\"preflight_report.json\",\"exists\":true,\"size_bytes\":16362}},\"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:18:21+00:00\"}}",
        "last_error": null,
        "completed_at": "2026-05-19 20:18:24",
        "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": 20,
            "run_id": 4,
            "event_type": "cloned",
            "message": "Workflow cloned as #5",
            "meta_json": "{\"new_run_id\":5}",
            "created_at": "2026-05-19 20:18:25"
        },
        {
            "id": 18,
            "run_id": 4,
            "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/10/exports/collection_10_workflow_gate_acceptance_201755_20260519_201823.zip\",\"zip_public_url\":\"/assets/pod/collections/10/exports/collection_10_workflow_gate_acceptance_201755_20260519_201823.zip\",\"manifest_path\":\"/assets/pod/collections/10/exports/collection_10_workflow_gate_acceptance_201755_20260519_201823_manifest.json\",\"file_count\":13,\"missing_count\":0,\"warnings\":[],\"manifest\":{\"collection_id\":10,\"collection_no\":\"COL-20260519201755-05179f\",\"title\":\"Workflow gate acceptance 201755\",\"created_at\":\"2026-05-19 20:17:55\",\"exported_at\":\"2026-05-19T20:18:22+00:00\",\"revision\":{\"revision_id\":0,\"revision_no\":0,\"revision_label\":\"\",\"is_active\":false},\"master\":{\"artwork\":{\"role\":\"master_artwork\",\"public_path\":\"/assets/pod/collections/10/master/master_artwork.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/master/master_artwork.png\",\"zip_entry\":\"master/master_artwork.png\",\"exists\":true,\"size_bytes\":42379},\"print\":{\"role\":\"master_print\",\"public_path\":\"/assets/pod/collections/10/master/master_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/master/master_print.png\",\"zip_entry\":\"master/master_print.png\",\"exists\":true,\"size_bytes\":244535}},\"items\":[{\"item_id\":24,\"template_id\":28,\"template_name\":\"硬式洗漱墊\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_24_mockup\",\"public_path\":\"/assets/pod/collections/10/mockups/item_24_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/mockups/item_24_mockup.png\",\"zip_entry\":\"items/item_24_template_28/mockup.png\",\"exists\":true,\"size_bytes\":69989},\"print\":{\"role\":\"item_24_print\",\"public_path\":\"/assets/pod/collections/10/prints/item_24_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/prints/item_24_print.png\",\"zip_entry\":\"items/item_24_template_28/print.png\",\"exists\":true,\"size_bytes\":244535},\"panel_prints\":[]},{\"item_id\":25,\"template_id\":27,\"template_name\":\"硬式杯墊(圓型)\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_25_mockup\",\"public_path\":\"/assets/pod/collections/10/mockups/item_25_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/mockups/item_25_mockup.png\",\"zip_entry\":\"items/item_25_template_27/mockup.png\",\"exists\":true,\"size_bytes\":82260},\"print\":{\"role\":\"item_25_print\",\"public_path\":\"/assets/pod/collections/10/prints/item_25_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/prints/item_25_print.png\",\"zip_entry\":\"items/item_25_template_27/print.png\",\"exists\":true,\"size_bytes\":244535},\"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/10/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/10/specs/production_spec.html\",\"zip_entry\":\"production_spec.html\",\"exists\":true,\"size_bytes\":2861},\"csv\":{\"role\":\"production_spec_csv\",\"public_path\":\"/assets/pod/collections/10/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/10/specs/production_spec.csv\",\"zip_entry\":\"production_spec.csv\",\"exists\":true,\"size_bytes\":1251},\"json\":{\"role\":\"production_manifest_json\",\"public_path\":\"/assets/pod/collections/10/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/10/specs/production_manifest.json\",\"zip_entry\":\"production_manifest.json\",\"exists\":true,\"size_bytes\":4370}},\"preflight_files\":{\"html\":{\"role\":\"preflight_report_html\",\"public_path\":\"/assets/pod/collections/10/preflight/preflight_report.html\",\"local_path\":\"/var/www/html/assets/pod/collections/10/preflight/preflight_report.html\",\"zip_entry\":\"preflight_report.html\",\"exists\":true,\"size_bytes\":13190},\"json\":{\"role\":\"preflight_report_json\",\"public_path\":\"/assets/pod/collections/10/preflight/preflight_report.json\",\"local_path\":\"/var/www/html/assets/pod/collections/10/preflight/preflight_report.json\",\"zip_entry\":\"preflight_report.json\",\"exists\":true,\"size_bytes\":16362}},\"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:18:24"
        },
        {
            "id": 17,
            "run_id": 4,
            "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/10/exports/collection_10_workflow_gate_acceptance_201755_20260519_201823.zip\",\"zip_public_url\":\"/assets/pod/collections/10/exports/collection_10_workflow_gate_acceptance_201755_20260519_201823.zip\",\"manifest_path\":\"/assets/pod/collections/10/exports/collection_10_workflow_gate_acceptance_201755_20260519_201823_manifest.json\",\"file_count\":13,\"missing_count\":0,\"warnings\":[],\"manifest\":{\"collection_id\":10,\"collection_no\":\"COL-20260519201755-05179f\",\"title\":\"Workflow gate acceptance 201755\",\"created_at\":\"2026-05-19 20:17:55\",\"exported_at\":\"2026-05-19T20:18:22+00:00\",\"revision\":{\"revision_id\":0,\"revision_no\":0,\"revision_label\":\"\",\"is_active\":false},\"master\":{\"artwork\":{\"role\":\"master_artwork\",\"public_path\":\"/assets/pod/collections/10/master/master_artwork.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/master/master_artwork.png\",\"zip_entry\":\"master/master_artwork.png\",\"exists\":true,\"size_bytes\":42379},\"print\":{\"role\":\"master_print\",\"public_path\":\"/assets/pod/collections/10/master/master_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/master/master_print.png\",\"zip_entry\":\"master/master_print.png\",\"exists\":true,\"size_bytes\":244535}},\"items\":[{\"item_id\":24,\"template_id\":28,\"template_name\":\"硬式洗漱墊\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_24_mockup\",\"public_path\":\"/assets/pod/collections/10/mockups/item_24_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/mockups/item_24_mockup.png\",\"zip_entry\":\"items/item_24_template_28/mockup.png\",\"exists\":true,\"size_bytes\":69989},\"print\":{\"role\":\"item_24_print\",\"public_path\":\"/assets/pod/collections/10/prints/item_24_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/prints/item_24_print.png\",\"zip_entry\":\"items/item_24_template_28/print.png\",\"exists\":true,\"size_bytes\":244535},\"panel_prints\":[]},{\"item_id\":25,\"template_id\":27,\"template_name\":\"硬式杯墊(圓型)\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_25_mockup\",\"public_path\":\"/assets/pod/collections/10/mockups/item_25_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/mockups/item_25_mockup.png\",\"zip_entry\":\"items/item_25_template_27/mockup.png\",\"exists\":true,\"size_bytes\":82260},\"print\":{\"role\":\"item_25_print\",\"public_path\":\"/assets/pod/collections/10/prints/item_25_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/prints/item_25_print.png\",\"zip_entry\":\"items/item_25_template_27/print.png\",\"exists\":true,\"size_bytes\":244535},\"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/10/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/10/specs/production_spec.html\",\"zip_entry\":\"production_spec.html\",\"exists\":true,\"size_bytes\":2861},\"csv\":{\"role\":\"production_spec_csv\",\"public_path\":\"/assets/pod/collections/10/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/10/specs/production_spec.csv\",\"zip_entry\":\"production_spec.csv\",\"exists\":true,\"size_bytes\":1251},\"json\":{\"role\":\"production_manifest_json\",\"public_path\":\"/assets/pod/collections/10/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/10/specs/production_manifest.json\",\"zip_entry\":\"production_manifest.json\",\"exists\":true,\"size_bytes\":4370}},\"preflight_files\":{\"html\":{\"role\":\"preflight_report_html\",\"public_path\":\"/assets/pod/collections/10/preflight/preflight_report.html\",\"local_path\":\"/var/www/html/assets/pod/collections/10/preflight/preflight_report.html\",\"zip_entry\":\"preflight_report.html\",\"exists\":true,\"size_bytes\":13190},\"json\":{\"role\":\"preflight_report_json\",\"public_path\":\"/assets/pod/collections/10/preflight/preflight_report.json\",\"local_path\":\"/var/www/html/assets/pod/collections/10/preflight/preflight_report.json\",\"zip_entry\":\"preflight_report.json\",\"exists\":true,\"size_bytes\":16362}},\"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:18:23"
        },
        {
            "id": 16,
            "run_id": 4,
            "event_type": "admin_override",
            "message": "Admin override enabled for export gate.",
            "meta_json": "{\"reason\":\"acceptance dry-run override\"}",
            "created_at": "2026-05-19 20:18:21"
        },
        {
            "id": 15,
            "run_id": 4,
            "event_type": "step_fail",
            "message": "Step 5 preflight: Preflight fail / score 0",
            "meta_json": "{\"score\":0,\"report\":{\"collection_id\":10,\"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\":10}},{\"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/10/master/master_artwork.png\",\"details\":{\"public_path\":\"/assets/pod/collections/10/master/master_artwork.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/master/master_artwork.png\",\"exists\":true,\"size_bytes\":42379,\"width\":1400,\"height\":1400,\"mime\":\"image/png\"}},{\"code\":\"master_print_path_exists\",\"level\":\"pass\",\"message\":\"Master print exists\",\"path\":\"/assets/pod/collections/10/master/master_print.png\",\"details\":{\"public_path\":\"/assets/pod/collections/10/master/master_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/master/master_print.png\",\"exists\":true,\"size_bytes\":244535,\"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 24 template_id check\",\"path\":\"\",\"details\":{\"item_id\":24,\"template_id\":28}},{\"code\":\"item_has_apply_mode\",\"level\":\"pass\",\"message\":\"Item 24 apply_mode check\",\"path\":\"\",\"details\":{\"item_id\":24,\"apply_mode\":\"tile-cover\"}},{\"code\":\"item_mockup_exists\",\"level\":\"pass\",\"message\":\"Item mockup exists\",\"path\":\"/assets/pod/collections/10/mockups/item_24_mockup.png\",\"details\":{\"item_id\":24,\"public_path\":\"/assets/pod/collections/10/mockups/item_24_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/mockups/item_24_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/10/prints/item_24_print.png\",\"details\":{\"item_id\":24,\"public_path\":\"/assets/pod/collections/10/prints/item_24_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/prints/item_24_print.png\",\"exists\":true,\"size_bytes\":244535,\"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\":24}},{\"code\":\"print_file_is_png_or_supported\",\"level\":\"pass\",\"message\":\"Print file extension is supported\",\"path\":\"/assets/pod/collections/10/prints/item_24_print.png\",\"details\":{\"item_id\":24,\"mime\":\"image/png\"}},{\"code\":\"image_dimensions_readable\",\"level\":\"pass\",\"message\":\"Image dimensions readable\",\"path\":\"/assets/pod/collections/10/prints/item_24_print.png\",\"details\":{\"item_id\":24,\"width\":3000,\"height\":3000}},{\"code\":\"image_min_size\",\"level\":\"pass\",\"message\":\"Print image size is acceptable\",\"path\":\"/assets/pod/collections/10/prints/item_24_print.png\",\"details\":{\"item_id\":24,\"width\":3000,\"height\":3000}},{\"code\":\"public_url_resolvable\",\"level\":\"pass\",\"message\":\"Public path resolves to local file\",\"path\":\"/assets/pod/collections/10/prints/item_24_print.png\",\"details\":{\"item_id\":24}},{\"code\":\"item_has_template_id\",\"level\":\"pass\",\"message\":\"Item 25 template_id check\",\"path\":\"\",\"details\":{\"item_id\":25,\"template_id\":27}},{\"code\":\"item_has_apply_mode\",\"level\":\"pass\",\"message\":\"Item 25 apply_mode check\",\"path\":\"\",\"details\":{\"item_id\":25,\"apply_mode\":\"tile-cover\"}},{\"code\":\"item_mockup_exists\",\"level\":\"pass\",\"message\":\"Item mockup exists\",\"path\":\"/assets/pod/collections/10/mockups/item_25_mockup.png\",\"details\":{\"item_id\":25,\"public_path\":\"/assets/pod/collections/10/mockups/item_25_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/mockups/item_25_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/10/prints/item_25_print.png\",\"details\":{\"item_id\":25,\"public_path\":\"/assets/pod/collections/10/prints/item_25_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/10/prints/item_25_print.png\",\"exists\":true,\"size_bytes\":244535,\"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\":25}},{\"code\":\"print_file_is_png_or_supported\",\"level\":\"pass\",\"message\":\"Print file extension is supported\",\"path\":\"/assets/pod/collections/10/prints/item_25_print.png\",\"details\":{\"item_id\":25,\"mime\":\"image/png\"}},{\"code\":\"image_dimensions_readable\",\"level\":\"pass\",\"message\":\"Image dimensions readable\",\"path\":\"/assets/pod/collections/10/prints/item_25_print.png\",\"details\":{\"item_id\":25,\"width\":3000,\"height\":3000}},{\"code\":\"image_min_size\",\"level\":\"pass\",\"message\":\"Print image size is acceptable\",\"path\":\"/assets/pod/collections/10/prints/item_25_print.png\",\"details\":{\"item_id\":25,\"width\":3000,\"height\":3000}},{\"code\":\"public_url_resolvable\",\"level\":\"pass\",\"message\":\"Public path resolves to local file\",\"path\":\"/assets/pod/collections/10/prints/item_25_print.png\",\"details\":{\"item_id\":25}},{\"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/10/specs/production_spec.html\",\"details\":{\"public_path\":\"/assets/pod/collections/10/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/10/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/10/specs/production_spec.csv\",\"details\":{\"public_path\":\"/assets/pod/collections/10/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/10/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/10/specs/production_manifest.json\",\"details\":{\"public_path\":\"/assets/pod/collections/10/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/10/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/10/specs/production_manifest.json\",\"details\":[]},{\"code\":\"csv_has_rows\",\"level\":\"fail\",\"message\":\"CSV has no data rows\",\"path\":\"/assets/pod/collections/10/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/10/specs/production_spec.html\",\"details\":{\"public_path\":\"/assets/pod/collections/10/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/10/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/10/specs/production_spec.csv\",\"details\":{\"public_path\":\"/assets/pod/collections/10/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/10/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/10/specs/production_manifest.json\",\"details\":{\"public_path\":\"/assets/pod/collections/10/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/10/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/10/specs/production_manifest.json\",\"details\":[]},{\"code\":\"csv_has_rows\",\"level\":\"fail\",\"message\":\"CSV has no data rows\",\"path\":\"/assets/pod/collections/10/specs/production_spec.csv\",\"details\":{\"rows\":0}}],\"generated_at\":\"2026-05-19T20:18:20+00:00\"}}",
            "created_at": "2026-05-19 20:18:20"
        },
        {
            "id": 14,
            "run_id": 4,
            "event_type": "step_pass",
            "message": "Step 4 apply_items: Applied 2 items.",
            "meta_json": "{\"results\":[{\"item_id\":24,\"template_id\":28,\"apply_mode\":\"tile-cover\",\"mockup_path\":\"/assets/pod/collections/10/mockups/item_24_mockup.png\",\"print_path\":\"/assets/pod/collections/10/prints/item_24_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\":25,\"template_id\":27,\"apply_mode\":\"tile-cover\",\"mockup_path\":\"/assets/pod/collections/10/mockups/item_25_mockup.png\",\"print_path\":\"/assets/pod/collections/10/prints/item_25_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:18:19"
        },
        {
            "id": 13,
            "run_id": 4,
            "event_type": "step_pass",
            "message": "Step 3 templates: 2 templates selected.",
            "meta_json": "{\"template_ids\":[28,27]}",
            "created_at": "2026-05-19 20:18:02"
        },
        {
            "id": 12,
            "run_id": 4,
            "event_type": "step_pass",
            "message": "Step 2 master_artwork: Master artwork ready.",
            "meta_json": "{\"master_artwork_path\":\"/assets/pod/collections/10/master/master_artwork.png\"}",
            "created_at": "2026-05-19 20:18:02"
        },
        {
            "id": 11,
            "run_id": 4,
            "event_type": "step_pass",
            "message": "Step 1 prompt: Acceptance prompt/profile selected.",
            "meta_json": "{\"settings\":{\"title\":\"Workflow gate acceptance 201755\",\"aspect_ratio\":\"1:1\"}}",
            "created_at": "2026-05-19 20:17:55"
        }
    ]
}