{"ok":true,"patch":"171","layer":"guest_publish_flow","generated_at":"2026-06-04T19:22:45Z","tenant":{"id":1,"slug":"stg","name":"SocialTouch Internal","status":"active"},"event":{"id":4,"slug":"20260705_SingleEvent","name":"Test Single Event Pass","env":"prod","status":"active","publish_state":"draft","published":false,"published_at":null,"expired_at":null,"archived_at":null,"deleted_at":null,"gallery_enabled":true,"face_search_enabled":true,"upload_button_enabled":false},"media":{"active_images":0,"thumb_ready":0,"indexed":0},"readiness":{"found":true,"event_id":4,"ready":false,"guest_visible":false,"published":false,"published_at":null,"status":"active","blockers":["no_active_images"],"warnings":[],"features":{"gallery_enabled":true,"face_search_enabled":true,"upload_button_enabled":false},"counts":{"total_images":0,"active_images":0,"pending_processing":0,"failed_processing":0},"event":{"id":4,"tenant_id":1,"slug":"20260705_SingleEvent","name":"Test Single Event Pass"},"schema":{"columns":["id","tenant_id","slug","env","name","status","start_at","end_at","created_at","updated_at","team_mode_password","gallery_enabled","face_search_enabled","upload_button_enabled","batch_job_enabled","search_threshold","gallery_sort","logo_url","background_url","primary_color","text_color","hero_title","hero_subtitle","owner_entitlement_id","published_at","archived_at","deleted_at","retention_days","storage_bytes_cached","photo_count_cached","last_usage_recalculated_at","original_storage_bytes","thumb_storage_bytes","processing_storage_bytes","total_storage_bytes","storage_recalculated_at","expired_at","readonly_after_expire","auto_archive","auth_team_code","auth_client_code","auth_admin_code","guest_password"],"has_published_at":true,"has_feature_flags":{"gallery_enabled":true,"face_search_enabled":true,"upload_button_enabled":true}}},"runtime":{"event_id":4,"guest_visible":false,"published":false,"status":"active","blockers":["no_active_images"],"warnings":[],"routes":{"landing_allowed":false,"gallery_allowed":false,"face_search_allowed":false,"upload_button_allowed":false},"readiness":{"found":true,"event_id":4,"ready":false,"guest_visible":false,"published":false,"published_at":null,"status":"active","blockers":["no_active_images"],"warnings":[],"features":{"gallery_enabled":true,"face_search_enabled":true,"upload_button_enabled":false},"counts":{"total_images":0,"active_images":0,"pending_processing":0,"failed_processing":0},"event":{"id":4,"tenant_id":1,"slug":"20260705_SingleEvent","name":"Test Single Event Pass"},"schema":{"columns":["id","tenant_id","slug","env","name","status","start_at","end_at","created_at","updated_at","team_mode_password","gallery_enabled","face_search_enabled","upload_button_enabled","batch_job_enabled","search_threshold","gallery_sort","logo_url","background_url","primary_color","text_color","hero_title","hero_subtitle","owner_entitlement_id","published_at","archived_at","deleted_at","retention_days","storage_bytes_cached","photo_count_cached","last_usage_recalculated_at","original_storage_bytes","thumb_storage_bytes","processing_storage_bytes","total_storage_bytes","storage_recalculated_at","expired_at","readonly_after_expire","auto_archive","auth_team_code","auth_client_code","auth_admin_code","guest_password"],"has_published_at":true,"has_feature_flags":{"gallery_enabled":true,"face_search_enabled":true,"upload_button_enabled":true}}}},"routes":[{"key":"landing","label":"Landing","url":"/guest/stg/20260705_SingleEvent","allowed":false,"reason":"event_not_published","deny_reasons":["event_not_published","no_active_images","landing_not_allowed"]},{"key":"gallery","label":"Gallery","url":"/guest/stg/20260705_SingleEvent/gallery","allowed":false,"reason":"event_not_published","deny_reasons":["event_not_published","no_active_images","gallery_not_allowed"]},{"key":"face_search","label":"Face Search","url":"/guest/stg/20260705_SingleEvent/search","allowed":false,"reason":"event_not_published","deny_reasons":["event_not_published","no_active_images","face_search_not_allowed"]}],"actions":[{"key":"publish","label":"Publish","method":"POST","url":"/app/stg/events/20260705_SingleEvent/publish-flow/publish","primary":true},{"key":"expire","label":"Mark Expired","method":"POST","url":"/app/stg/events/20260705_SingleEvent/publish-flow/expire","primary":false},{"key":"archive","label":"Archive","method":"POST","url":"/app/stg/events/20260705_SingleEvent/publish-flow/archive","primary":false}],"links":{"tenant_dashboard":"/app/stg","event_editor":"/app/stg/events/20260705_SingleEvent","workspace":"/app/stg/events/20260705_SingleEvent/workspace","team_console":"/team/stg/20260705_SingleEvent","publish_flow":"/app/stg/events/20260705_SingleEvent/publish-flow","publish_flow_json":"/app/stg/events/20260705_SingleEvent/publish-flow.json","guest_landing":"/guest/stg/20260705_SingleEvent","preview_landing":"/preview/stg/20260705_SingleEvent","preview_gallery":"/preview/stg/20260705_SingleEvent/gallery","preview_face_search":"/preview/stg/20260705_SingleEvent/search","preview_search_result":"/preview/stg/20260705_SingleEvent/search-result","preview_json":"/preview/stg/20260705_SingleEvent.json","guest_gallery":"/guest/stg/20260705_SingleEvent/gallery","guest_face_search":"/guest/stg/20260705_SingleEvent/search","guest_search_result":"/guest/stg/20260705_SingleEvent/search-result","guest_gallery_api":"/guest-api/stg/20260705_SingleEvent/gallery.json","search_status_api":"/guest-api/stg/20260705_SingleEvent/search/status.json"},"notes":["Public guest routes require the event to be published and not blocked.","Team Console remains the field-operation entry point, not a branding editor.","Preview routes are for staff/tenant review before publish and do not change public visibility.","Public guest routes still follow guard rules."]}