@@ -276,6 +276,7 @@ async def _open_kitchen_handler() -> str | None:
276276 except Exception :
277277 logger .warning ("open_kitchen_registry_failed" , exc_info = True )
278278
279+ ctx .gate_infrastructure_ready = True
279280 return None
280281
281282
@@ -331,6 +332,7 @@ def _close_kitchen_handler() -> None:
331332 ctx .recipe_content_hash = ""
332333 ctx .recipe_composite_hash = ""
333334 ctx .recipe_version = ""
335+ ctx .gate_infrastructure_ready = False
334336 logger .info ("close_kitchen" , gate_state = "closed" )
335337 if (log := ctx .github_api_log ) is not None :
336338 orphan_usage = log .drain (ctx .kitchen_id )
@@ -515,15 +517,30 @@ async def open_kitchen(
515517 disabled_subsets = _get_ctx ().config .subsets .disabled
516518
517519 _ctx_pre = _get_ctx ()
518- _is_deferred_recall = (
519- name is not None and _ctx_pre .gate .enabled and _ctx_pre .recipe_name == name
520- )
520+ _skip_handler = _ctx_pre .gate_infrastructure_ready
521+ tool_ctx = _get_ctx ()
521522
522- if not _is_deferred_recall :
523+ if not _skip_handler :
523524 handler_err = await _open_kitchen_handler ()
524525 if handler_err is not None :
525526 return handler_err
527+ else :
528+ _ctx_post = _get_ctx ()
529+ if _ctx_post .quota_refresh_task is None :
530+ try :
531+ _ctx_post .quota_refresh_task = create_background_task (
532+ _quota_refresh_loop (
533+ _ctx_post .config .quota_guard ,
534+ provider = resolve_provider (_ctx_post .config .providers .default_provider ),
535+ ),
536+ label = "quota_refresh_loop" ,
537+ )
538+ except Exception :
539+ logger .warning (
540+ "open_kitchen_quota_refresh_deferred_start_failed" , exc_info = True
541+ )
526542
543+ if not _skip_handler :
527544 _kctx_pre = _get_ctx ()
528545 _skip_notify = (
529546 _kctx_pre .backend is not None
@@ -538,6 +555,7 @@ async def open_kitchen(
538555 logger .warning (
539556 "open_kitchen_failure" , stage = "enable_components" , exc_info = True
540557 )
558+ tool_ctx .gate_infrastructure_ready = False
541559 return _kitchen_failure_envelope (exc , stage = "enable_components" )
542560
543561 try :
@@ -550,8 +568,16 @@ async def open_kitchen(
550568 )
551569 except Exception as exc :
552570 logger .warning ("open_kitchen_failure" , stage = "redisable_subsets" , exc_info = True )
571+ tool_ctx .gate_infrastructure_ready = False
553572 return _kitchen_failure_envelope (exc , stage = "redisable_subsets" )
554573
574+ _is_deferred_recall = (
575+ name is not None
576+ and _ctx_pre .gate .enabled
577+ and _ctx_pre .recipe_name == name
578+ and _ctx_pre .recipe_name != ""
579+ )
580+
555581 _forbidden_list = ", " .join (PIPELINE_FORBIDDEN_TOOLS )
556582 _ctx = _get_ctx ()
557583 _categories = _build_tool_category_listing (
@@ -645,6 +671,7 @@ async def open_kitchen(
645671 # Default to False for missing 'valid' so a absent key is treated as invalid
646672 if not result .get ("valid" , False ) or not result .get ("content" , "" ):
647673 tool_ctx .gate .disable ()
674+ tool_ctx .gate_infrastructure_ready = False
648675 return _recipe_validation_error_response (name , result )
649676 # Dispatch-feasibility preflight: verify the backend can enforce
650677 # all fix-required hooks for the recipe's run_skill steps.
@@ -658,6 +685,7 @@ async def open_kitchen(
658685 )
659686 if _preflight_err is not None :
660687 tool_ctx .gate .disable ()
688+ tool_ctx .gate_infrastructure_ready = False
661689 await ctx .disable_components (tags = {"kitchen" })
662690 return _preflight_err
663691 result ["success" ] = True
@@ -680,6 +708,8 @@ async def open_kitchen(
680708 )
681709 if _override_warnings :
682710 result ["warnings" ] = _override_warnings
711+ if ingredients_only :
712+ result = strip_ingredients_only_keys (result )
683713 return json .dumps (result )
684714 try :
685715 result = tool_ctx .recipes .load_and_validate (
@@ -749,6 +779,7 @@ async def open_kitchen(
749779
750780 if not result .get ("valid" , False ) or not result .get ("content" , "" ):
751781 tool_ctx .gate .disable ()
782+ tool_ctx .gate_infrastructure_ready = False
752783 return _recipe_validation_error_response (name , result )
753784
754785 # Dispatch-feasibility preflight: verify the backend can enforce
@@ -763,6 +794,7 @@ async def open_kitchen(
763794 )
764795 if _preflight_err is not None :
765796 tool_ctx .gate .disable ()
797+ tool_ctx .gate_infrastructure_ready = False
766798 await ctx .disable_components (tags = {"kitchen" })
767799 return _preflight_err
768800
0 commit comments