VDAMO Food Image Library
Generation control and coverage.
Track menu-main image set completion, inspect gaps, and control the server-side generator.
Generator stopped
Total assets1,587
Active GPT assets1,553
10+ asset groups128
Complete p01-p10 sets128
Partial sets242
Empty sets2,707
Completion4.2%
Generator
Controls the `foodlib-generator` Docker Compose service on the deployment host.
Compose directory
/vol1/docker/foodlib/appContainer status
foodlib-generator Exited (1) 24 hours ago
Last worker status
{
"schema_version": "foodlib-continuous-gpt-auto-ingest-status-v1",
"updated_at": "2026-06-18T14:27:00.951Z",
"max_cycles": 0,
"timeout_seconds": 240,
"state": "generating",
"cycle": 7,
"ingested": 6,
"theme_id": "theme_onigiri_salmon"
}Missing Image Sets
Highest-priority groups are closest to 10 images, followed by empty planned dishes.
| Dish | Country | Type | Category | Images | Slots | Missing | Latest |
|---|---|---|---|---|---|---|---|
Brazilian acai bowltheme_acai_bowl_brazil | BR | dessert | dessert | 1 | 1/10 | 9 | 2026-06-17 23:23:00 |
Adana kebabtheme_adana_kebab | TR | turkish | meat | 1 | 1/10 | 9 | 2026-06-17 23:42:34 |
Api moradotheme_api_morado | BO | bar-drink | drink | 1 | 1/10 | 9 | 2026-06-17 23:21:49 |
Barramundi fish and chipstheme_au_barramundi_fish_and_chips_v15 | AU | seafood | seafood | 1 | 1/10 | 9 | 2026-06-18 00:13:33 |
Chicken schnitzel rolltheme_au_chicken_schnitzel_roll_v15 | AU | fast-food | main-dish | 1 | 1/10 | 9 | 2026-06-18 00:12:20 |
Baksotheme_bakso | ID | indonesian | soup | 1 | 1/10 | 9 | 2026-06-18 03:44:23 |
Beef chow funtheme_beef_chow_fun | CN | chinese | noodle | 1 | 1/10 | 9 | 2026-06-18 02:25:02 |
Beijing zhajiangmiantheme_beijing_zhajiangmian | CN | noodle-shop | noodle | 1 | 1/10 | 9 | 2026-06-18 03:14:05 |
Belgian waffletheme_belgian_waffle | BE | dessert | dessert | 1 | 1/10 | 9 | 2026-06-17 23:00:01 |
Biryani combotheme_biryani_combo | IN | indian | set-meal | 1 | 1/10 | 9 | 2026-06-17 23:25:18 |
Bitterballentheme_bitterballen | NL | bar-drink | side-dish | 1 | 1/10 | 9 | 2026-06-17 23:02:16 |
Brown sugar boba milktheme_brown_sugar_boba | TW | milk-tea | milk-tea | 1 | 1/10 | 9 | 2026-06-17 23:33:58 |
Bryndzove haluskytheme_bryndzove_halusky | SK | eastern-european | main-dish | 1 | 1/10 | 9 | 2026-06-17 23:05:00 |
Bun bo Huetheme_bun_bo_hue | VN | vietnamese | noodle | 1 | 1/10 | 9 | 2026-06-18 02:37:08 |
Burritotheme_burrito | MX | mexican | main-dish | 1 | 1/10 | 9 | 2026-06-18 02:46:37 |
Cao lautheme_cao_lau | VN | vietnamese | noodle | 1 | 1/10 | 9 | 2026-06-18 03:43:02 |
Char siu ricetheme_char_siu_rice | CN | chinese | rice | 1 | 1/10 | 9 | 2026-06-18 02:24:03 |
Cheese foam milk teatheme_cheese_foam_milk_tea | TW | milk-tea | milk-tea | 1 | 1/10 | 9 | 2026-06-17 23:32:52 |
Saudi chicken kabsatheme_chicken_kabsa_saudi | SA | middle-eastern | rice | 1 | 1/10 | 9 | 2026-06-17 23:46:29 |
Chicken paprikashtheme_chicken_paprikash | HU | eastern-european | hot-dish | 1 | 1/10 | 9 | 2026-06-17 23:09:15 |
Moroccan chicken taginetheme_chicken_tagine_morocco | MA | north-african | main-dish | 1 | 1/10 | 9 | 2026-06-17 23:54:29 |
Chicken tikka masalatheme_chicken_tikka_masala | GB | indian | curry | 1 | 1/10 | 9 | 2026-06-18 02:51:21 |
Singapore chili crabtheme_chili_crab | SG | seafood | seafood | 1 | 1/10 | 9 | 2026-06-18 02:16:29 |
Chole bhaturetheme_chole_bhature | IN | indian | main-dish | 1 | 1/10 | 9 | 2026-06-18 02:45:50 |
Chongqing xiaomiantheme_chongqing_xiaomian | CN | noodle-shop | noodle | 1 | 1/10 | 9 | 2026-06-18 03:12:45 |
Ciorba de burtatheme_ciorba_de_burta | RO | eastern-european | soup | 1 | 1/10 | 9 | 2026-06-17 23:15:09 |
Clam chowdertheme_clam_chowder | US | western | soup | 1 | 1/10 | 9 | 2026-06-18 02:49:03 |
Gongbao jidingtheme_cn_gongbao_jiding_v15 | CN | chinese | hot-dish | 1 | 1/10 | 9 | 2026-06-18 00:14:29 |
Lanzhou niurou miantheme_cn_lanzhou_niurou_mian_v15 | CN | noodle-shop | noodle | 1 | 1/10 | 9 | 2026-06-18 00:16:44 |
Mala xiangguotheme_cn_mala_xiangguo_v15 | CN | hotpot | hot-dish | 1 | 1/10 | 9 | 2026-06-18 00:17:45 |
Shuizhu niuroutheme_cn_shuizhu_niurou_v15 | CN | chinese | meat | 1 | 1/10 | 9 | 2026-06-18 00:15:34 |
Vietnamese broken ricetheme_com_tam | VN | vietnamese | rice | 1 | 1/10 | 9 | 2026-06-18 02:35:37 |
Creme bruleetheme_creme_brulee | FR | dessert | dessert | 1 | 1/10 | 9 | 2026-06-18 03:05:40 |
Croque monsieurtheme_croque_monsieur | FR | cafe | main-dish | 1 | 1/10 | 9 | 2026-06-18 03:04:41 |
Cumin lamb skewerstheme_cumin_lamb_skewers | CN | barbecue | meat | 1 | 1/10 | 9 | 2026-06-18 03:17:23 |
Currywursttheme_currywurst | DE | fast-food | meat | 1 | 1/10 | 9 | 2026-06-18 02:55:33 |
Dal makhanitheme_dal_makhani | IN | indian | curry | 1 | 1/10 | 9 | 2026-06-18 03:50:41 |
Bratwurst platetheme_de_bratwurst_plate_v15 | DE | fast-food | meat | 1 | 1/10 | 9 | 2026-06-18 00:30:37 |
Käsekuchentheme_de_kaesekuchen_v15 | DE | dessert | dessert | 1 | 1/10 | 9 | 2026-06-18 00:31:37 |
Schnitzel mit pommestheme_de_schnitzel_mit_pommes_v15 | DE | western | meat | 1 | 1/10 | 9 | 2026-06-18 00:29:28 |
Dobos tortetheme_dobos_torte | HU | dessert | dessert | 1 | 1/10 | 9 | 2026-06-17 23:11:50 |
Egg tarttheme_egg_tart | CN | bakery | dessert | 1 | 1/10 | 9 | 2026-06-18 03:03:26 |
Bocadillo de jamontheme_es_bocadillo_de_jamon_v15 | ES | spanish | main-dish | 1 | 1/10 | 9 | 2026-06-18 00:28:19 |
Café crèmetheme_fr_cafe_creme_v15 | FR | coffee | coffee | 1 | 1/10 | 9 | 2026-06-18 00:25:04 |
Crepe completetheme_fr_crepe_complete_v15 | FR | dessert | bakery | 1 | 1/10 | 9 | 2026-06-18 00:23:05 |
Tarte tatintheme_fr_tarte_tatin_v15 | FR | dessert | dessert | 1 | 1/10 | 9 | 2026-06-18 00:23:58 |
Fresh mango juicetheme_fresh_mango_juice | AE | bar-drink | drink | 1 | 1/10 | 9 | 2026-06-17 23:50:14 |
Fried chicken buckettheme_fried_chicken_bucket | US | fast-food | set-meal | 1 | 1/10 | 9 | 2026-06-17 23:27:26 |
Panang currytheme_gaeng_panang | TH | thai | curry | 1 | 1/10 | 9 | 2026-06-18 03:18:49 |
Korean galbitheme_galbi | KR | barbecue | meat | 1 | 1/10 | 9 | 2026-06-18 02:34:19 |
Gazpachotheme_gazpacho | ES | western | cold-dish | 1 | 1/10 | 9 | 2026-06-18 02:53:25 |
Githeritheme_githeri | KE | african | main-dish | 1 | 1/10 | 9 | 2026-06-17 23:57:12 |
Chicken kontosouvlitheme_gr_chicken_kontosouvli_v15 | GR | barbecue | meat | 1 | 1/10 | 9 | 2026-06-18 00:22:13 |
Loukoumadestheme_gr_loukoumades_v15 | GR | dessert | dessert | 1 | 1/10 | 9 | 2026-06-18 00:20:59 |
Pastitsiotheme_gr_pastitsio_v15 | GR | greek | hot-dish | 1 | 1/10 | 9 | 2026-06-18 00:20:01 |
Tiropitatheme_gr_tiropita_v15 | GR | bakery | bakery | 1 | 1/10 | 9 | 2026-06-18 00:18:50 |
Guacamoletheme_guacamole | MX | mexican | side-dish | 1 | 1/10 | 9 | 2026-06-18 02:47:44 |
Gulab jamuntheme_gulab_jamun | IN | dessert | dessert | 1 | 1/10 | 9 | 2026-06-18 03:52:14 |
Hungarian gulyastheme_gulyas_hungarian | HU | eastern-european | soup | 1 | 1/10 | 9 | 2026-06-17 23:08:08 |
Gyozatheme_gyoza | JP | japanese | side-dish | 1 | 1/10 | 9 | 2026-06-18 03:01:35 |
Hainanese chicken choptheme_hainanese_chicken_chop | MY | western | meat | 1 | 1/10 | 9 | 2026-06-18 02:41:48 |
Hainanese chicken ricetheme_hainanese_chicken_rice | SG | quick-service | rice | 1 | 1/10 | 9 | 2026-06-18 02:15:06 |
Moroccan hariratheme_harira_moroccan | MA | north-african | soup | 1 | 1/10 | 9 | 2026-06-17 23:55:16 |
Hawawshitheme_hawawshi | EG | middle-eastern | main-dish | 1 | 1/10 | 9 | 2026-06-17 23:51:03 |
Hokkien meetheme_hokkien_mee | MY | malaysian | noodle | 1 | 1/10 | 9 | 2026-06-18 03:47:10 |
Hot and sour souptheme_hot_and_sour_soup | CN | chinese | soup | 1 | 1/10 | 9 | 2026-06-18 02:21:41 |
Mala hot pot broththeme_hot_pot_mala_broth | CN | hotpot | soup-base | 1 | 1/10 | 9 | 2026-06-18 02:26:22 |
Braised chicken ricetheme_huangmen_chicken_rice | CN | quick-service | rice | 1 | 1/10 | 9 | 2026-06-18 03:07:00 |
Iced lattetheme_iced_latte | US | cafe | coffee | 1 | 1/10 | 9 | 2026-06-17 23:29:24 |
Iskender kebabtheme_iskender_kebab | TR | turkish | meat | 1 | 1/10 | 9 | 2026-06-17 23:41:36 |
Lasagna al fornotheme_it_lasagna_al_forno_v15 | IT | western | hot-dish | 1 | 1/10 | 9 | 2026-06-18 00:26:21 |
Piadina romagnolatheme_it_piadina_romagnola_v15 | IT | bakery | main-dish | 1 | 1/10 | 9 | 2026-06-18 00:27:30 |
Jianbing guozitheme_jianbing_guozi | CN | fast-food | main-dish | 1 | 1/10 | 9 | 2026-06-18 03:09:20 |
Kapsalontheme_kapsalon | NL | fast-food | main-dish | 1 | 1/10 | 9 | 2026-06-17 23:01:10 |
Kapustnicatheme_kapustnica | SK | eastern-european | soup | 1 | 1/10 | 9 | 2026-06-17 23:06:07 |
Kaya toasttheme_kaya_toast | MY | cafe | bakery | 1 | 1/10 | 9 | 2026-06-18 03:49:24 |
Kenyan pilautheme_kenyan_pilau | KE | african | rice | 1 | 1/10 | 9 | 2026-06-18 00:05:01 |
Kimbaptheme_kimbap | KR | korean | main-dish | 1 | 1/10 | 9 | 2026-06-18 02:32:50 |
Korean army stewtheme_korean_army_stew | KR | korean | hot-dish | 1 | 1/10 | 9 | 2026-06-17 23:37:10 |
Korean corn dogtheme_korean_corn_dog | KR | street-food | side-dish | 1 | 1/10 | 9 | 2026-06-17 23:38:13 |
Lahmacuntheme_lahmacun | TR | turkish | bakery | 1 | 1/10 | 9 | 2026-06-17 23:43:56 |
Langostheme_langos | HU | street-food | bakery | 1 | 1/10 | 9 | 2026-06-17 23:10:27 |
Lanzhou beef noodlestheme_lanzhou_beef_noodles | CN | noodle-shop | noodle | 1 | 1/10 | 9 | 2026-06-18 03:08:01 |
Liuzhou luosifentheme_liuzhou_luosifen | CN | noodle-shop | noodle | 1 | 1/10 | 9 | 2026-06-18 03:11:49 |
Luqaimattheme_luqaimat | AE | dessert | dessert | 1 | 1/10 | 9 | 2026-06-17 23:49:25 |
Kenyan mandazitheme_mandazi_kenya | KE | bakery | bakery | 1 | 1/10 | 9 | 2026-06-17 23:58:20 |
Saudi lamb manditheme_mandi_lamb_saudi | SA | middle-eastern | rice | 1 | 1/10 | 9 | 2026-06-17 23:47:29 |
Mango sticky rice delivery boxtheme_mango_sticky_rice_delivery | TH | dessert | dessert | 1 | 1/10 | 9 | 2026-06-17 23:34:49 |
Brazilian marmitatheme_marmita_brazil | BR | fast-food | set-meal | 1 | 1/10 | 9 | 2026-06-17 23:24:08 |
Masala chaitheme_masala_chai | IN | bar-drink | drink | 1 | 1/10 | 9 | 2026-06-17 23:26:05 |
Massaman currytheme_masaman_curry | TH | thai | curry | 1 | 1/10 | 9 | 2026-06-18 02:17:44 |
Matcha lattetheme_matcha_latte | JP | cafe | coffee | 1 | 1/10 | 9 | 2026-06-17 23:30:26 |
Mercimek corbasitheme_mercimek_corbasi | TR | turkish | soup | 1 | 1/10 | 9 | 2026-06-17 23:45:07 |
Micitheme_mici | RO | barbecue | meat | 1 | 1/10 | 9 | 2026-06-17 23:14:01 |
Mie gorengtheme_mie_goreng | ID | indonesian | noodle | 1 | 1/10 | 9 | 2026-06-18 02:40:01 |
Milkshaketheme_milkshake | US | fast-food | drink | 1 | 1/10 | 9 | 2026-06-18 03:54:37 |
Miso ramentheme_miso_ramen | JP | ramen | noodle | 1 | 1/10 | 9 | 2026-06-18 03:27:41 |
Molokhia chickentheme_molokhia_chicken | EG | middle-eastern | soup | 1 | 1/10 | 9 | 2026-06-17 23:51:59 |
Montreal smoked meat sandwichtheme_montreal_smoked_meat | CA | western | main-dish | 1 | 1/10 | 9 | 2026-06-18 02:57:43 |
Mutabbaqtheme_mutabbaq | SA | street-food | bakery | 1 | 1/10 | 9 | 2026-06-17 23:48:17 |
Okonomiyakitheme_okonomiyaki | JP | japanese | main-dish | 1 | 1/10 | 9 | 2026-06-18 02:29:05 |
Pad see ewtheme_pad_see_ew | TH | thai | noodle | 1 | 1/10 | 9 | 2026-06-18 03:19:58 |
Paella Valencianatheme_paella_valenciana | ES | western | rice | 1 | 1/10 | 9 | 2026-06-18 02:52:24 |
Palak paneertheme_palak_paneer | IN | indian | curry | 1 | 1/10 | 9 | 2026-06-18 02:43:08 |
Papanasitheme_papanasi | RO | dessert | dessert | 1 | 1/10 | 9 | 2026-06-17 23:16:14 |
Chicken pastillatheme_pastilla_chicken | MA | north-african | bakery | 1 | 1/10 | 9 | 2026-06-18 00:03:41 |
Peri peri chickentheme_peri_peri_chicken | ZA | barbecue | meat | 1 | 1/10 | 9 | 2026-06-18 02:59:01 |
Pho gatheme_pho_ga | VN | vietnamese | noodle | 1 | 1/10 | 9 | 2026-06-17 23:40:20 |
Turkish pidetheme_pide_turkish | TR | turkish | bakery | 1 | 1/10 | 9 | 2026-06-17 23:59:12 |
Pineapple fried ricetheme_pineapple_fried_rice | TH | thai | rice | 1 | 1/10 | 9 | 2026-06-18 02:19:07 |
Pique machotheme_pique_macho | BO | latin | meat | 1 | 1/10 | 9 | 2026-06-17 23:19:59 |
Poffertjestheme_poffertjes | NL | dessert | dessert | 1 | 1/10 | 9 | 2026-06-17 23:04:13 |
Poutinetheme_poutine | CA | fast-food | side-dish | 1 | 1/10 | 9 | 2026-06-18 02:56:28 |
Thai red curry ducktheme_red_curry_duck | TH | thai | curry | 1 | 1/10 | 9 | 2026-06-18 02:20:23 |
Roti canaitheme_roti_canai | MY | malaysian | bakery | 1 | 1/10 | 9 | 2026-06-18 02:40:51 |
Roujiamotheme_roujiamo | CN | fast-food | main-dish | 1 | 1/10 | 9 | 2026-06-18 03:10:25 |
Saudi saleegtheme_saleeg_saudi | SA | middle-eastern | rice | 1 | 1/10 | 9 | 2026-06-18 00:00:21 |
Saltenastheme_saltenas | BO | bakery | bakery | 1 | 1/10 | 9 | 2026-06-17 23:17:42 |
Samosatheme_samosa | IN | indian | side-dish | 1 | 1/10 | 9 | 2026-06-18 02:44:28 |
Romanian sarmaletheme_sarmale_romanian | RO | eastern-european | main-dish | 1 | 1/10 | 9 | 2026-06-17 23:13:00 |
Worker Log
Tail of continuous auto-ingest log.
{"step":"export-gpt","args":["generation:export-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"outDir\": \"/app/artifacts/generation/gpt-production/pid-19\",\n \"batch_id\": \"gpt_foodlib_20260618_001\",\n \"theme_count\": 1,\n \"request_count\": 1,\n \"model\": \"agnes-image-2.1-flash\",\n \"backend_policy\": \"gpt-only-no-fallback\"\n}\n","stderr_tail":"$ node scripts/export-gpt-production-batch.mjs\n","at":"2026-06-18T14:20:04.006Z"}
{"step":"run-gpt","args":["generation:run-gpt"],"exit_code":1,"stdout_tail":"[ELIFECYCLE] Command failed with exit code 1.\n","stderr_tail":"$ node scripts/run-gpt-image-batch.mjs\nfile:///app/scripts/run-gpt-image-batch.mjs:12\n throw new Error(message);\n ^\n\nError: no GPT image requests matched the current filters\n at fail (file:///app/scripts/run-gpt-image-batch.mjs:12:9)\n at file:///app/scripts/run-gpt-image-batch.mjs:154:28\n at ModuleJob.run (node:internal/modules/esm/module_job:343:25)\n at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26)\n at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5)\n\nNode.js v22.22.3\n","at":"2026-06-18T14:20:05.850Z"}
{"step":"cycle-error","theme_id":"theme_larb_moo","cycle":3,"consecutive_failures":3,"error":{"name":"Error","message":"run-gpt failed with status 1"},"at":"2026-06-18T14:20:05.851Z"}
{"step":"export-gpt","args":["generation:export-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"outDir\": \"/app/artifacts/generation/gpt-production/pid-19\",\n \"batch_id\": \"gpt_foodlib_20260618_001\",\n \"theme_count\": 1,\n \"request_count\": 1,\n \"model\": \"agnes-image-2.1-flash\",\n \"backend_policy\": \"gpt-only-no-fallback\"\n}\n","stderr_tail":"$ node scripts/export-gpt-production-batch.mjs\n","at":"2026-06-18T14:20:26.795Z"}
{"step":"run-gpt","args":["generation:run-gpt"],"exit_code":1,"stdout_tail":"[ELIFECYCLE] Command failed with exit code 1.\n","stderr_tail":"$ node scripts/run-gpt-image-batch.mjs\nfile:///app/scripts/run-gpt-image-batch.mjs:12\n throw new Error(message);\n ^\n\nError: no GPT image requests matched the current filters\n at fail (file:///app/scripts/run-gpt-image-batch.mjs:12:9)\n at file:///app/scripts/run-gpt-image-batch.mjs:154:28\n at ModuleJob.run (node:internal/modules/esm/module_job:343:25)\n at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26)\n at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5)\n\nNode.js v22.22.3\n","at":"2026-06-18T14:20:28.700Z"}
{"step":"cycle-error","theme_id":"theme_larb_moo","cycle":4,"consecutive_failures":4,"error":{"name":"Error","message":"run-gpt failed with status 1"},"at":"2026-06-18T14:20:28.701Z"}
{"step":"export-gpt","args":["generation:export-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"outDir\": \"/app/artifacts/generation/gpt-production/pid-19\",\n \"batch_id\": \"gpt_foodlib_20260618_001\",\n \"theme_count\": 1,\n \"request_count\": 1,\n \"model\": \"agnes-image-2.1-flash\",\n \"backend_policy\": \"gpt-only-no-fallback\"\n}\n","stderr_tail":"$ node scripts/export-gpt-production-batch.mjs\n","at":"2026-06-18T14:20:49.668Z"}
{"step":"run-gpt","args":["generation:run-gpt"],"exit_code":1,"stdout_tail":"[ELIFECYCLE] Command failed with exit code 1.\n","stderr_tail":"$ node scripts/run-gpt-image-batch.mjs\nfile:///app/scripts/run-gpt-image-batch.mjs:12\n throw new Error(message);\n ^\n\nError: no GPT image requests matched the current filters\n at fail (file:///app/scripts/run-gpt-image-batch.mjs:12:9)\n at file:///app/scripts/run-gpt-image-batch.mjs:154:28\n at ModuleJob.run (node:internal/modules/esm/module_job:343:25)\n at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26)\n at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5)\n\nNode.js v22.22.3\n","at":"2026-06-18T14:20:51.503Z"}
{"step":"cycle-error","theme_id":"theme_larb_moo","cycle":5,"consecutive_failures":5,"error":{"name":"Error","message":"run-gpt failed with status 1"},"at":"2026-06-18T14:20:51.503Z"}
{"step":"export-gpt","args":["generation:export-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"outDir\": \"/app/artifacts/generation/gpt-production/pid-19\",\n \"batch_id\": \"gpt_foodlib_20260618_001\",\n \"theme_count\": 1,\n \"request_count\": 1,\n \"model\": \"agnes-image-2.1-flash\",\n \"backend_policy\": \"gpt-only-no-fallback\"\n}\n","stderr_tail":"$ node scripts/export-gpt-production-batch.mjs\n","at":"2026-06-18T14:21:40.623Z"}
{"step":"run-gpt","args":["generation:run-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reportPath\": \"/app/artifacts/generation/gpt-production/pid-19/run-report.json\",\n \"requested_count\": 1,\n \"generated_count\": 1,\n \"timeout_seconds_per_image\": 240,\n \"generator\": \"/app/scripts/generate_image.py\"\n}\n","stderr_tail":"$ node scripts/run-gpt-image-batch.mjs\n","at":"2026-06-18T14:22:18.048Z"}
{"step":"import-output","args":["generation:import-gpt-output"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"importManifestPath\": \"/app/artifacts/generation/gpt-production/pid-19/import-manifest.json\",\n \"outputDir\": \"/app/artifacts/generation/gpt-production/pid-19/generated-input\",\n \"importedDir\": \"/app/artifacts/generation/gpt-production/pid-19/imported\",\n \"imported_count\": 1\n}\n","stderr_tail":"$ node scripts/import-gpt-output-manifest.mjs\n","at":"2026-06-18T14:22:18.633Z"}
{"step":"create-quality-review","args":["generation:create-quality-review"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reviewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.json\",\n \"previewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.html\",\n \"item_count\": 1\n}\n","stderr_tail":"$ node scripts/create-gpt-quality-review.mjs\n","at":"2026-06-18T14:22:19.217Z"}
{"step":"ingest-reviewed-assets","args":["generation:ingest-reviewed-assets"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"ingested_count\": 1,\n \"status\": \"needs-human-review\",\n \"dbPath\": \"/app/data/foodlib.sqlite\"\n}\n","stderr_tail":"$ node scripts/ingest-gpt-reviewed-assets.mjs\n","at":"2026-06-18T14:22:20.074Z"}
{"step":"export-gpt","args":["generation:export-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"outDir\": \"/app/artifacts/generation/gpt-production/pid-19\",\n \"batch_id\": \"gpt_foodlib_20260618_001\",\n \"theme_count\": 1,\n \"request_count\": 1,\n \"model\": \"agnes-image-2.1-flash\",\n \"backend_policy\": \"gpt-only-no-fallback\"\n}\n","stderr_tail":"$ node scripts/export-gpt-production-batch.mjs\n","at":"2026-06-18T14:22:41.076Z"}
{"step":"run-gpt","args":["generation:run-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reportPath\": \"/app/artifacts/generation/gpt-production/pid-19/run-report.json\",\n \"requested_count\": 1,\n \"generated_count\": 1,\n \"timeout_seconds_per_image\": 240,\n \"generator\": \"/app/scripts/generate_image.py\"\n}\n","stderr_tail":"$ node scripts/run-gpt-image-batch.mjs\n","at":"2026-06-18T14:23:05.803Z"}
{"step":"import-output","args":["generation:import-gpt-output"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"importManifestPath\": \"/app/artifacts/generation/gpt-production/pid-19/import-manifest.json\",\n \"outputDir\": \"/app/artifacts/generation/gpt-production/pid-19/generated-input\",\n \"importedDir\": \"/app/artifacts/generation/gpt-production/pid-19/imported\",\n \"imported_count\": 1\n}\n","stderr_tail":"$ node scripts/import-gpt-output-manifest.mjs\n","at":"2026-06-18T14:23:06.417Z"}
{"step":"create-quality-review","args":["generation:create-quality-review"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reviewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.json\",\n \"previewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.html\",\n \"item_count\": 1\n}\n","stderr_tail":"$ node scripts/create-gpt-quality-review.mjs\n","at":"2026-06-18T14:23:06.986Z"}
{"step":"ingest-reviewed-assets","args":["generation:ingest-reviewed-assets"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"ingested_count\": 1,\n \"status\": \"needs-human-review\",\n \"dbPath\": \"/app/data/foodlib.sqlite\"\n}\n","stderr_tail":"$ node scripts/ingest-gpt-reviewed-assets.mjs\n","at":"2026-06-18T14:23:07.759Z"}
{"step":"export-gpt","args":["generation:export-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"outDir\": \"/app/artifacts/generation/gpt-production/pid-19\",\n \"batch_id\": \"gpt_foodlib_20260618_001\",\n \"theme_count\": 1,\n \"request_count\": 1,\n \"model\": \"agnes-image-2.1-flash\",\n \"backend_policy\": \"gpt-only-no-fallback\"\n}\n","stderr_tail":"$ node scripts/export-gpt-production-batch.mjs\n","at":"2026-06-18T14:23:28.729Z"}
{"step":"run-gpt","args":["generation:run-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reportPath\": \"/app/artifacts/generation/gpt-production/pid-19/run-report.json\",\n \"requested_count\": 1,\n \"generated_count\": 1,\n \"timeout_seconds_per_image\": 240,\n \"generator\": \"/app/scripts/generate_image.py\"\n}\n","stderr_tail":"$ node scripts/run-gpt-image-batch.mjs\n","at":"2026-06-18T14:23:48.457Z"}
{"step":"import-output","args":["generation:import-gpt-output"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"importManifestPath\": \"/app/artifacts/generation/gpt-production/pid-19/import-manifest.json\",\n \"outputDir\": \"/app/artifacts/generation/gpt-production/pid-19/generated-input\",\n \"importedDir\": \"/app/artifacts/generation/gpt-production/pid-19/imported\",\n \"imported_count\": 1\n}\n","stderr_tail":"$ node scripts/import-gpt-output-manifest.mjs\n","at":"2026-06-18T14:23:49.068Z"}
{"step":"create-quality-review","args":["generation:create-quality-review"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reviewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.json\",\n \"previewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.html\",\n \"item_count\": 1\n}\n","stderr_tail":"$ node scripts/create-gpt-quality-review.mjs\n","at":"2026-06-18T14:23:49.650Z"}
{"step":"ingest-reviewed-assets","args":["generation:ingest-reviewed-assets"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"ingested_count\": 1,\n \"status\": \"needs-human-review\",\n \"dbPath\": \"/app/data/foodlib.sqlite\"\n}\n","stderr_tail":"$ node scripts/ingest-gpt-reviewed-assets.mjs\n","at":"2026-06-18T14:23:50.418Z"}
{"step":"export-gpt","args":["generation:export-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"outDir\": \"/app/artifacts/generation/gpt-production/pid-19\",\n \"batch_id\": \"gpt_foodlib_20260618_001\",\n \"theme_count\": 1,\n \"request_count\": 1,\n \"model\": \"agnes-image-2.1-flash\",\n \"backend_policy\": \"gpt-only-no-fallback\"\n}\n","stderr_tail":"$ node scripts/export-gpt-production-batch.mjs\n","at":"2026-06-18T14:24:11.483Z"}
{"step":"run-gpt","args":["generation:run-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reportPath\": \"/app/artifacts/generation/gpt-production/pid-19/run-report.json\",\n \"requested_count\": 1,\n \"generated_count\": 1,\n \"timeout_seconds_per_image\": 240,\n \"generator\": \"/app/scripts/generate_image.py\"\n}\n","stderr_tail":"$ node scripts/run-gpt-image-batch.mjs\n","at":"2026-06-18T14:24:35.115Z"}
{"step":"import-output","args":["generation:import-gpt-output"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"importManifestPath\": \"/app/artifacts/generation/gpt-production/pid-19/import-manifest.json\",\n \"outputDir\": \"/app/artifacts/generation/gpt-production/pid-19/generated-input\",\n \"importedDir\": \"/app/artifacts/generation/gpt-production/pid-19/imported\",\n \"imported_count\": 1\n}\n","stderr_tail":"$ node scripts/import-gpt-output-manifest.mjs\n","at":"2026-06-18T14:24:35.673Z"}
{"step":"create-quality-review","args":["generation:create-quality-review"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reviewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.json\",\n \"previewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.html\",\n \"item_count\": 1\n}\n","stderr_tail":"$ node scripts/create-gpt-quality-review.mjs\n","at":"2026-06-18T14:24:36.281Z"}
{"step":"ingest-reviewed-assets","args":["generation:ingest-reviewed-assets"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"ingested_count\": 1,\n \"status\": \"needs-human-review\",\n \"dbPath\": \"/app/data/foodlib.sqlite\"\n}\n","stderr_tail":"$ node scripts/ingest-gpt-reviewed-assets.mjs\n","at":"2026-06-18T14:24:37.095Z"}
{"step":"export-gpt","args":["generation:export-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"outDir\": \"/app/artifacts/generation/gpt-production/pid-19\",\n \"batch_id\": \"gpt_foodlib_20260618_001\",\n \"theme_count\": 1,\n \"request_count\": 1,\n \"model\": \"agnes-image-2.1-flash\",\n \"backend_policy\": \"gpt-only-no-fallback\"\n}\n","stderr_tail":"$ node scripts/export-gpt-production-batch.mjs\n","at":"2026-06-18T14:24:58.078Z"}
{"step":"run-gpt","args":["generation:run-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reportPath\": \"/app/artifacts/generation/gpt-production/pid-19/run-report.json\",\n \"requested_count\": 1,\n \"generated_count\": 1,\n \"timeout_seconds_per_image\": 240,\n \"generator\": \"/app/scripts/generate_image.py\"\n}\n","stderr_tail":"$ node scripts/run-gpt-image-batch.mjs\n","at":"2026-06-18T14:25:44.512Z"}
{"step":"import-output","args":["generation:import-gpt-output"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"importManifestPath\": \"/app/artifacts/generation/gpt-production/pid-19/import-manifest.json\",\n \"outputDir\": \"/app/artifacts/generation/gpt-production/pid-19/generated-input\",\n \"importedDir\": \"/app/artifacts/generation/gpt-production/pid-19/imported\",\n \"imported_count\": 1\n}\n","stderr_tail":"$ node scripts/import-gpt-output-manifest.mjs\n","at":"2026-06-18T14:25:45.111Z"}
{"step":"create-quality-review","args":["generation:create-quality-review"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reviewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.json\",\n \"previewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.html\",\n \"item_count\": 1\n}\n","stderr_tail":"$ node scripts/create-gpt-quality-review.mjs\n","at":"2026-06-18T14:25:45.673Z"}
{"step":"ingest-reviewed-assets","args":["generation:ingest-reviewed-assets"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"ingested_count\": 1,\n \"status\": \"needs-human-review\",\n \"dbPath\": \"/app/data/foodlib.sqlite\"\n}\n","stderr_tail":"$ node scripts/ingest-gpt-reviewed-assets.mjs\n","at":"2026-06-18T14:25:46.485Z"}
{"step":"export-gpt","args":["generation:export-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"outDir\": \"/app/artifacts/generation/gpt-production/pid-19\",\n \"batch_id\": \"gpt_foodlib_20260618_001\",\n \"theme_count\": 1,\n \"request_count\": 1,\n \"model\": \"agnes-image-2.1-flash\",\n \"backend_policy\": \"gpt-only-no-fallback\"\n}\n","stderr_tail":"$ node scripts/export-gpt-production-batch.mjs\n","at":"2026-06-18T14:26:07.531Z"}
{"step":"run-gpt","args":["generation:run-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reportPath\": \"/app/artifacts/generation/gpt-production/pid-19/run-report.json\",\n \"requested_count\": 1,\n \"generated_count\": 1,\n \"timeout_seconds_per_image\": 240,\n \"generator\": \"/app/scripts/generate_image.py\"\n}\n","stderr_tail":"$ node scripts/run-gpt-image-batch.mjs\n","at":"2026-06-18T14:26:38.667Z"}
{"step":"import-output","args":["generation:import-gpt-output"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"importManifestPath\": \"/app/artifacts/generation/gpt-production/pid-19/import-manifest.json\",\n \"outputDir\": \"/app/artifacts/generation/gpt-production/pid-19/generated-input\",\n \"importedDir\": \"/app/artifacts/generation/gpt-production/pid-19/imported\",\n \"imported_count\": 1\n}\n","stderr_tail":"$ node scripts/import-gpt-output-manifest.mjs\n","at":"2026-06-18T14:26:39.255Z"}
{"step":"create-quality-review","args":["generation:create-quality-review"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"reviewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.json\",\n \"previewPath\": \"/app/artifacts/generation/gpt-production/pid-19/quality-review.html\",\n \"item_count\": 1\n}\n","stderr_tail":"$ node scripts/create-gpt-quality-review.mjs\n","at":"2026-06-18T14:26:39.824Z"}
{"step":"ingest-reviewed-assets","args":["generation:ingest-reviewed-assets"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"ingested_count\": 1,\n \"status\": \"needs-human-review\",\n \"dbPath\": \"/app/data/foodlib.sqlite\"\n}\n","stderr_tail":"$ node scripts/ingest-gpt-reviewed-assets.mjs\n","at":"2026-06-18T14:26:40.645Z"}
{"step":"export-gpt","args":["generation:export-gpt"],"exit_code":0,"stdout_tail":"{\n \"ok\": true,\n \"outDir\": \"/app/artifacts/generation/gpt-production/pid-19\",\n \"batch_id\": \"gpt_foodlib_20260618_001\",\n \"theme_count\": 1,\n \"request_count\": 1,\n \"model\": \"agnes-image-2.1-flash\",\n \"backend_policy\": \"gpt-only-no-fallback\"\n}\n","stderr_tail":"$ node scripts/export-gpt-production-batch.mjs\n","at":"2026-06-18T14:27:01.603Z"}