{
    "success": true,
    "run": {
        "id": 1,
        "workflow_no": "WF-ACC-20260519195924",
        "collection_id": 8,
        "current_step": 7,
        "status": "completed",
        "prompt_preset_id": null,
        "wizard_profile_id": 2,
        "master_artwork_path": "/assets/pod/collections/8/master/master_artwork.png",
        "selected_template_ids_json": "[28,27]",
        "settings_json": "{\"apply_mode\":\"tile-cover\",\"dry_run\":true}",
        "created_at": "2026-05-19 19:59:24",
        "updated_at": "2026-05-19 19:59:50",
        "meta_json": "{\"gemini_calls\":0,\"preflight\":{\"collection_id\":8,\"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\":8}},{\"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/8/master/master_artwork.png\",\"details\":{\"public_path\":\"/assets/pod/collections/8/master/master_artwork.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/master/master_artwork.png\",\"exists\":true,\"size_bytes\":42395,\"width\":1400,\"height\":1400,\"mime\":\"image/png\"}},{\"code\":\"master_print_path_exists\",\"level\":\"pass\",\"message\":\"Master print exists\",\"path\":\"/assets/pod/collections/8/master/master_print.png\",\"details\":{\"public_path\":\"/assets/pod/collections/8/master/master_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/master/master_print.png\",\"exists\":true,\"size_bytes\":244774,\"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 20 template_id check\",\"path\":\"\",\"details\":{\"item_id\":20,\"template_id\":28}},{\"code\":\"item_has_apply_mode\",\"level\":\"pass\",\"message\":\"Item 20 apply_mode check\",\"path\":\"\",\"details\":{\"item_id\":20,\"apply_mode\":\"tile-cover\"}},{\"code\":\"item_mockup_exists\",\"level\":\"pass\",\"message\":\"Item mockup exists\",\"path\":\"/assets/pod/collections/8/mockups/item_20_mockup.png\",\"details\":{\"item_id\":20,\"public_path\":\"/assets/pod/collections/8/mockups/item_20_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/mockups/item_20_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/8/prints/item_20_print.png\",\"details\":{\"item_id\":20,\"public_path\":\"/assets/pod/collections/8/prints/item_20_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/prints/item_20_print.png\",\"exists\":true,\"size_bytes\":244774,\"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\":20}},{\"code\":\"print_file_is_png_or_supported\",\"level\":\"pass\",\"message\":\"Print file extension is supported\",\"path\":\"/assets/pod/collections/8/prints/item_20_print.png\",\"details\":{\"item_id\":20,\"mime\":\"image/png\"}},{\"code\":\"image_dimensions_readable\",\"level\":\"pass\",\"message\":\"Image dimensions readable\",\"path\":\"/assets/pod/collections/8/prints/item_20_print.png\",\"details\":{\"item_id\":20,\"width\":3000,\"height\":3000}},{\"code\":\"image_min_size\",\"level\":\"pass\",\"message\":\"Print image size is acceptable\",\"path\":\"/assets/pod/collections/8/prints/item_20_print.png\",\"details\":{\"item_id\":20,\"width\":3000,\"height\":3000}},{\"code\":\"public_url_resolvable\",\"level\":\"pass\",\"message\":\"Public path resolves to local file\",\"path\":\"/assets/pod/collections/8/prints/item_20_print.png\",\"details\":{\"item_id\":20}},{\"code\":\"item_has_template_id\",\"level\":\"pass\",\"message\":\"Item 21 template_id check\",\"path\":\"\",\"details\":{\"item_id\":21,\"template_id\":27}},{\"code\":\"item_has_apply_mode\",\"level\":\"pass\",\"message\":\"Item 21 apply_mode check\",\"path\":\"\",\"details\":{\"item_id\":21,\"apply_mode\":\"tile-cover\"}},{\"code\":\"item_mockup_exists\",\"level\":\"pass\",\"message\":\"Item mockup exists\",\"path\":\"/assets/pod/collections/8/mockups/item_21_mockup.png\",\"details\":{\"item_id\":21,\"public_path\":\"/assets/pod/collections/8/mockups/item_21_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/mockups/item_21_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/8/prints/item_21_print.png\",\"details\":{\"item_id\":21,\"public_path\":\"/assets/pod/collections/8/prints/item_21_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/prints/item_21_print.png\",\"exists\":true,\"size_bytes\":244774,\"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\":21}},{\"code\":\"print_file_is_png_or_supported\",\"level\":\"pass\",\"message\":\"Print file extension is supported\",\"path\":\"/assets/pod/collections/8/prints/item_21_print.png\",\"details\":{\"item_id\":21,\"mime\":\"image/png\"}},{\"code\":\"image_dimensions_readable\",\"level\":\"pass\",\"message\":\"Image dimensions readable\",\"path\":\"/assets/pod/collections/8/prints/item_21_print.png\",\"details\":{\"item_id\":21,\"width\":3000,\"height\":3000}},{\"code\":\"image_min_size\",\"level\":\"pass\",\"message\":\"Print image size is acceptable\",\"path\":\"/assets/pod/collections/8/prints/item_21_print.png\",\"details\":{\"item_id\":21,\"width\":3000,\"height\":3000}},{\"code\":\"public_url_resolvable\",\"level\":\"pass\",\"message\":\"Public path resolves to local file\",\"path\":\"/assets/pod/collections/8/prints/item_21_print.png\",\"details\":{\"item_id\":21}},{\"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/8/specs/production_spec.html\",\"details\":{\"public_path\":\"/assets/pod/collections/8/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/8/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/8/specs/production_spec.csv\",\"details\":{\"public_path\":\"/assets/pod/collections/8/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/8/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/8/specs/production_manifest.json\",\"details\":{\"public_path\":\"/assets/pod/collections/8/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/8/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/8/specs/production_manifest.json\",\"details\":[]},{\"code\":\"csv_has_rows\",\"level\":\"fail\",\"message\":\"CSV has no data rows\",\"path\":\"/assets/pod/collections/8/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/8/specs/production_spec.html\",\"details\":{\"public_path\":\"/assets/pod/collections/8/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/8/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/8/specs/production_spec.csv\",\"details\":{\"public_path\":\"/assets/pod/collections/8/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/8/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/8/specs/production_manifest.json\",\"details\":{\"public_path\":\"/assets/pod/collections/8/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/8/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/8/specs/production_manifest.json\",\"details\":[]},{\"code\":\"csv_has_rows\",\"level\":\"fail\",\"message\":\"CSV has no data rows\",\"path\":\"/assets/pod/collections/8/specs/production_spec.csv\",\"details\":{\"rows\":0}}],\"generated_at\":\"2026-05-19T19:59:47+00:00\"},\"export\":{\"success\":true,\"zip_archive_available\":true,\"revision_id\":0,\"zip_path\":\"/var/www/html/assets/pod/collections/8/exports/collection_8_workflow_acceptance_dry_run_195924_20260519_195949.zip\",\"zip_public_url\":\"/assets/pod/collections/8/exports/collection_8_workflow_acceptance_dry_run_195924_20260519_195949.zip\",\"manifest_path\":\"/assets/pod/collections/8/exports/collection_8_workflow_acceptance_dry_run_195924_20260519_195949_manifest.json\",\"file_count\":13,\"missing_count\":0,\"warnings\":[],\"manifest\":{\"collection_id\":8,\"collection_no\":\"COL-20260519195924-8ca880\",\"title\":\"Workflow acceptance dry-run 195924\",\"created_at\":\"2026-05-19 19:59:24\",\"exported_at\":\"2026-05-19T19:59:48+00:00\",\"revision\":{\"revision_id\":0,\"revision_no\":0,\"revision_label\":\"\",\"is_active\":false},\"master\":{\"artwork\":{\"role\":\"master_artwork\",\"public_path\":\"/assets/pod/collections/8/master/master_artwork.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/master/master_artwork.png\",\"zip_entry\":\"master/master_artwork.png\",\"exists\":true,\"size_bytes\":42395},\"print\":{\"role\":\"master_print\",\"public_path\":\"/assets/pod/collections/8/master/master_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/master/master_print.png\",\"zip_entry\":\"master/master_print.png\",\"exists\":true,\"size_bytes\":244774}},\"items\":[{\"item_id\":20,\"template_id\":28,\"template_name\":\"硬式洗漱墊\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_20_mockup\",\"public_path\":\"/assets/pod/collections/8/mockups/item_20_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/mockups/item_20_mockup.png\",\"zip_entry\":\"items/item_20_template_28/mockup.png\",\"exists\":true,\"size_bytes\":69989},\"print\":{\"role\":\"item_20_print\",\"public_path\":\"/assets/pod/collections/8/prints/item_20_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/prints/item_20_print.png\",\"zip_entry\":\"items/item_20_template_28/print.png\",\"exists\":true,\"size_bytes\":244774},\"panel_prints\":[]},{\"item_id\":21,\"template_id\":27,\"template_name\":\"硬式杯墊(圓型)\",\"apply_mode\":\"tile-cover\",\"panel_count\":1,\"status\":\"completed\",\"mockup\":{\"role\":\"item_21_mockup\",\"public_path\":\"/assets/pod/collections/8/mockups/item_21_mockup.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/mockups/item_21_mockup.png\",\"zip_entry\":\"items/item_21_template_27/mockup.png\",\"exists\":true,\"size_bytes\":82260},\"print\":{\"role\":\"item_21_print\",\"public_path\":\"/assets/pod/collections/8/prints/item_21_print.png\",\"local_path\":\"/var/www/html/assets/pod/collections/8/prints/item_21_print.png\",\"zip_entry\":\"items/item_21_template_27/print.png\",\"exists\":true,\"size_bytes\":244774},\"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/8/specs/production_spec.html\",\"local_path\":\"/var/www/html/assets/pod/collections/8/specs/production_spec.html\",\"zip_entry\":\"production_spec.html\",\"exists\":true,\"size_bytes\":2857},\"csv\":{\"role\":\"production_spec_csv\",\"public_path\":\"/assets/pod/collections/8/specs/production_spec.csv\",\"local_path\":\"/var/www/html/assets/pod/collections/8/specs/production_spec.csv\",\"zip_entry\":\"production_spec.csv\",\"exists\":true,\"size_bytes\":1257},\"json\":{\"role\":\"production_manifest_json\",\"public_path\":\"/assets/pod/collections/8/specs/production_manifest.json\",\"local_path\":\"/var/www/html/assets/pod/collections/8/specs/production_manifest.json\",\"zip_entry\":\"production_manifest.json\",\"exists\":true,\"size_bytes\":4354}},\"preflight_files\":{\"html\":{\"role\":\"preflight_report_html\",\"public_path\":\"/assets/pod/collections/8/preflight/preflight_report.html\",\"local_path\":\"/var/www/html/assets/pod/collections/8/preflight/preflight_report.html\",\"zip_entry\":\"preflight_report.html\",\"exists\":true,\"size_bytes\":13151},\"json\":{\"role\":\"preflight_report_json\",\"public_path\":\"/assets/pod/collections/8/preflight/preflight_report.json\",\"local_path\":\"/var/www/html/assets/pod/collections/8/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": null,
        "last_error": null,
        "completed_at": null,
        "copied_from_run_id": null
    },
    "steps": {
        "1": {
            "step_no": 1,
            "step_key": "prompt",
            "label": "Prompt",
            "status": "pass",
            "score": null,
            "message": "Workflow 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": []
}