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,704
Active GPT assets1,670
10+ asset groups141
Complete p01-p10 sets141
Partial sets229
Empty sets2,707
Completion4.6%

Generator

Controls the `foodlib-generator` Docker Compose service on the deployment host.

Compose directory/vol1/docker/foodlib/app
Container status
foodlib-generator Exited (1) 26 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.

120 rows
DishCountryTypeCategoryImagesSlotsMissingLatest
Brazilian acai bowltheme_acai_bowl_brazilBRdessertdessert11/1092026-06-17 23:23:00
Adana kebabtheme_adana_kebabTRturkishmeat11/1092026-06-17 23:42:34
Api moradotheme_api_moradoBObar-drinkdrink11/1092026-06-17 23:21:49
Barramundi fish and chipstheme_au_barramundi_fish_and_chips_v15AUseafoodseafood11/1092026-06-18 00:13:33
Chicken schnitzel rolltheme_au_chicken_schnitzel_roll_v15AUfast-foodmain-dish11/1092026-06-18 00:12:20
Baksotheme_baksoIDindonesiansoup11/1092026-06-18 03:44:23
Beef chow funtheme_beef_chow_funCNchinesenoodle11/1092026-06-18 02:25:02
Beijing zhajiangmiantheme_beijing_zhajiangmianCNnoodle-shopnoodle11/1092026-06-18 03:14:05
Biryani combotheme_biryani_comboINindianset-meal11/1092026-06-17 23:25:18
Brown sugar boba milktheme_brown_sugar_bobaTWmilk-teamilk-tea11/1092026-06-17 23:33:58
Bun bo Huetheme_bun_bo_hueVNvietnamesenoodle11/1092026-06-18 02:37:08
Burritotheme_burritoMXmexicanmain-dish11/1092026-06-18 02:46:37
Cao lautheme_cao_lauVNvietnamesenoodle11/1092026-06-18 03:43:02
Char siu ricetheme_char_siu_riceCNchineserice11/1092026-06-18 02:24:03
Cheese foam milk teatheme_cheese_foam_milk_teaTWmilk-teamilk-tea11/1092026-06-17 23:32:52
Saudi chicken kabsatheme_chicken_kabsa_saudiSAmiddle-easternrice11/1092026-06-17 23:46:29
Moroccan chicken taginetheme_chicken_tagine_moroccoMAnorth-africanmain-dish11/1092026-06-17 23:54:29
Chicken tikka masalatheme_chicken_tikka_masalaGBindiancurry11/1092026-06-18 02:51:21
Singapore chili crabtheme_chili_crabSGseafoodseafood11/1092026-06-18 02:16:29
Chole bhaturetheme_chole_bhatureINindianmain-dish11/1092026-06-18 02:45:50
Chongqing xiaomiantheme_chongqing_xiaomianCNnoodle-shopnoodle11/1092026-06-18 03:12:45
Ciorba de burtatheme_ciorba_de_burtaROeastern-europeansoup11/1092026-06-17 23:15:09
Clam chowdertheme_clam_chowderUSwesternsoup11/1092026-06-18 02:49:03
Gongbao jidingtheme_cn_gongbao_jiding_v15CNchinesehot-dish11/1092026-06-18 00:14:29
Lanzhou niurou miantheme_cn_lanzhou_niurou_mian_v15CNnoodle-shopnoodle11/1092026-06-18 00:16:44
Mala xiangguotheme_cn_mala_xiangguo_v15CNhotpothot-dish11/1092026-06-18 00:17:45
Shuizhu niuroutheme_cn_shuizhu_niurou_v15CNchinesemeat11/1092026-06-18 00:15:34
Vietnamese broken ricetheme_com_tamVNvietnameserice11/1092026-06-18 02:35:37
Creme bruleetheme_creme_bruleeFRdessertdessert11/1092026-06-18 03:05:40
Croque monsieurtheme_croque_monsieurFRcafemain-dish11/1092026-06-18 03:04:41
Cumin lamb skewerstheme_cumin_lamb_skewersCNbarbecuemeat11/1092026-06-18 03:17:23
Currywursttheme_currywurstDEfast-foodmeat11/1092026-06-18 02:55:33
Dal makhanitheme_dal_makhaniINindiancurry11/1092026-06-18 03:50:41
Bratwurst platetheme_de_bratwurst_plate_v15DEfast-foodmeat11/1092026-06-18 00:30:37
Käsekuchentheme_de_kaesekuchen_v15DEdessertdessert11/1092026-06-18 00:31:37
Schnitzel mit pommestheme_de_schnitzel_mit_pommes_v15DEwesternmeat11/1092026-06-18 00:29:28
Egg tarttheme_egg_tartCNbakerydessert11/1092026-06-18 03:03:26
Bocadillo de jamontheme_es_bocadillo_de_jamon_v15ESspanishmain-dish11/1092026-06-18 00:28:19
Café crèmetheme_fr_cafe_creme_v15FRcoffeecoffee11/1092026-06-18 00:25:04
Crepe completetheme_fr_crepe_complete_v15FRdessertbakery11/1092026-06-18 00:23:05
Tarte tatintheme_fr_tarte_tatin_v15FRdessertdessert11/1092026-06-18 00:23:58
Fresh mango juicetheme_fresh_mango_juiceAEbar-drinkdrink11/1092026-06-17 23:50:14
Fried chicken buckettheme_fried_chicken_bucketUSfast-foodset-meal11/1092026-06-17 23:27:26
Panang currytheme_gaeng_panangTHthaicurry11/1092026-06-18 03:18:49
Korean galbitheme_galbiKRbarbecuemeat11/1092026-06-18 02:34:19
Gazpachotheme_gazpachoESwesterncold-dish11/1092026-06-18 02:53:25
Githeritheme_githeriKEafricanmain-dish11/1092026-06-17 23:57:12
Chicken kontosouvlitheme_gr_chicken_kontosouvli_v15GRbarbecuemeat11/1092026-06-18 00:22:13
Loukoumadestheme_gr_loukoumades_v15GRdessertdessert11/1092026-06-18 00:20:59
Pastitsiotheme_gr_pastitsio_v15GRgreekhot-dish11/1092026-06-18 00:20:01
Tiropitatheme_gr_tiropita_v15GRbakerybakery11/1092026-06-18 00:18:50
Guacamoletheme_guacamoleMXmexicanside-dish11/1092026-06-18 02:47:44
Gulab jamuntheme_gulab_jamunINdessertdessert11/1092026-06-18 03:52:14
Gyozatheme_gyozaJPjapaneseside-dish11/1092026-06-18 03:01:35
Hainanese chicken choptheme_hainanese_chicken_chopMYwesternmeat11/1092026-06-18 02:41:48
Hainanese chicken ricetheme_hainanese_chicken_riceSGquick-servicerice11/1092026-06-18 02:15:06
Moroccan hariratheme_harira_moroccanMAnorth-africansoup11/1092026-06-17 23:55:16
Hawawshitheme_hawawshiEGmiddle-easternmain-dish11/1092026-06-17 23:51:03
Hokkien meetheme_hokkien_meeMYmalaysiannoodle11/1092026-06-18 03:47:10
Hot and sour souptheme_hot_and_sour_soupCNchinesesoup11/1092026-06-18 02:21:41
Mala hot pot broththeme_hot_pot_mala_brothCNhotpotsoup-base11/1092026-06-18 02:26:22
Braised chicken ricetheme_huangmen_chicken_riceCNquick-servicerice11/1092026-06-18 03:07:00
Iced lattetheme_iced_latteUScafecoffee11/1092026-06-17 23:29:24
Iskender kebabtheme_iskender_kebabTRturkishmeat11/1092026-06-17 23:41:36
Lasagna al fornotheme_it_lasagna_al_forno_v15ITwesternhot-dish11/1092026-06-18 00:26:21
Piadina romagnolatheme_it_piadina_romagnola_v15ITbakerymain-dish11/1092026-06-18 00:27:30
Jianbing guozitheme_jianbing_guoziCNfast-foodmain-dish11/1092026-06-18 03:09:20
Kaya toasttheme_kaya_toastMYcafebakery11/1092026-06-18 03:49:24
Kenyan pilautheme_kenyan_pilauKEafricanrice11/1092026-06-18 00:05:01
Kimbaptheme_kimbapKRkoreanmain-dish11/1092026-06-18 02:32:50
Korean army stewtheme_korean_army_stewKRkoreanhot-dish11/1092026-06-17 23:37:10
Korean corn dogtheme_korean_corn_dogKRstreet-foodside-dish11/1092026-06-17 23:38:13
Lahmacuntheme_lahmacunTRturkishbakery11/1092026-06-17 23:43:56
Lanzhou beef noodlestheme_lanzhou_beef_noodlesCNnoodle-shopnoodle11/1092026-06-18 03:08:01
Liuzhou luosifentheme_liuzhou_luosifenCNnoodle-shopnoodle11/1092026-06-18 03:11:49
Luqaimattheme_luqaimatAEdessertdessert11/1092026-06-17 23:49:25
Kenyan mandazitheme_mandazi_kenyaKEbakerybakery11/1092026-06-17 23:58:20
Saudi lamb manditheme_mandi_lamb_saudiSAmiddle-easternrice11/1092026-06-17 23:47:29
Mango sticky rice delivery boxtheme_mango_sticky_rice_deliveryTHdessertdessert11/1092026-06-17 23:34:49
Brazilian marmitatheme_marmita_brazilBRfast-foodset-meal11/1092026-06-17 23:24:08
Masala chaitheme_masala_chaiINbar-drinkdrink11/1092026-06-17 23:26:05
Massaman currytheme_masaman_curryTHthaicurry11/1092026-06-18 02:17:44
Matcha lattetheme_matcha_latteJPcafecoffee11/1092026-06-17 23:30:26
Mercimek corbasitheme_mercimek_corbasiTRturkishsoup11/1092026-06-17 23:45:07
Micitheme_miciRObarbecuemeat11/1092026-06-17 23:14:01
Mie gorengtheme_mie_gorengIDindonesiannoodle11/1092026-06-18 02:40:01
Milkshaketheme_milkshakeUSfast-fooddrink11/1092026-06-18 03:54:37
Miso ramentheme_miso_ramenJPramennoodle11/1092026-06-18 03:27:41
Molokhia chickentheme_molokhia_chickenEGmiddle-easternsoup11/1092026-06-17 23:51:59
Montreal smoked meat sandwichtheme_montreal_smoked_meatCAwesternmain-dish11/1092026-06-18 02:57:43
Mutabbaqtheme_mutabbaqSAstreet-foodbakery11/1092026-06-17 23:48:17
Okonomiyakitheme_okonomiyakiJPjapanesemain-dish11/1092026-06-18 02:29:05
Pad see ewtheme_pad_see_ewTHthainoodle11/1092026-06-18 03:19:58
Paella Valencianatheme_paella_valencianaESwesternrice11/1092026-06-18 02:52:24
Palak paneertheme_palak_paneerINindiancurry11/1092026-06-18 02:43:08
Papanasitheme_papanasiROdessertdessert11/1092026-06-17 23:16:14
Chicken pastillatheme_pastilla_chickenMAnorth-africanbakery11/1092026-06-18 00:03:41
Peri peri chickentheme_peri_peri_chickenZAbarbecuemeat11/1092026-06-18 02:59:01
Pho gatheme_pho_gaVNvietnamesenoodle11/1092026-06-17 23:40:20
Turkish pidetheme_pide_turkishTRturkishbakery11/1092026-06-17 23:59:12
Pineapple fried ricetheme_pineapple_fried_riceTHthairice11/1092026-06-18 02:19:07
Pique machotheme_pique_machoBOlatinmeat11/1092026-06-17 23:19:59
Poutinetheme_poutineCAfast-foodside-dish11/1092026-06-18 02:56:28
Thai red curry ducktheme_red_curry_duckTHthaicurry11/1092026-06-18 02:20:23
Roti canaitheme_roti_canaiMYmalaysianbakery11/1092026-06-18 02:40:51
Roujiamotheme_roujiamoCNfast-foodmain-dish11/1092026-06-18 03:10:25
Saudi saleegtheme_saleeg_saudiSAmiddle-easternrice11/1092026-06-18 00:00:21
Saltenastheme_saltenasBObakerybakery11/1092026-06-17 23:17:42
Samosatheme_samosaINindianside-dish11/1092026-06-18 02:44:28
Schnitzeltheme_schnitzelDEwesternmeat11/1092026-06-18 02:54:31
Shepherd's pietheme_shepherds_pieGBwesternmain-dish11/1092026-06-18 02:50:19
Shoyu ramentheme_shoyu_ramenJPramennoodle11/1092026-06-18 03:28:43
Silpanchotheme_silpanchoBOlatinmain-dish11/1092026-06-17 23:18:52
Smash burgertheme_smash_burgerUSfast-foodmain-dish11/1092026-06-17 23:28:19
Soondubu jjigaetheme_soondubu_jjigaeKRkoreansoup11/1092026-06-18 02:31:30
Sopa de manitheme_sopa_de_maniBOlatinsoup11/1092026-06-17 23:20:53
Soto ayamtheme_soto_ayamIDindonesiansoup11/1092026-06-18 02:38:38
Sukuma wikitheme_sukuma_wikiKEafricanside-dish11/1092026-06-17 23:56:04
Chicken taginetheme_tagine_chickenMAmiddle-easternmeat11/1092026-06-18 03:00:19
Thai basil chicken ricetheme_thai_basil_chicken_riceTHthairice11/1092026-06-18 14:24:36

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"}