diff --git a/ymir/agents/triage_agent.py b/ymir/agents/triage_agent.py index aede715b7..8269c1ed8 100644 --- a/ymir/agents/triage_agent.py +++ b/ymir/agents/triage_agent.py @@ -1581,6 +1581,10 @@ async def retry(task, error, input=input, user_triggered=user_triggered): except Exception as e: logger.warning(f"Failed to check/queue primary for sibling {input.issue}: {e}") + # Modular issues (downstream_component = "module:stream/package") + # stop after triage — no downstream jobs or reproducer. + _modular_component = "/" in (state.downstream_component or "") + # Dispatch to downstream queues if output.resolution == Resolution.ERROR: await retry(task, output.data.model_dump_json()) @@ -1599,7 +1603,7 @@ async def retry(task, error, input=input, user_triggered=user_triggered): Resolution.CLARIFICATION_NEEDED, Resolution.OPEN_ENDED_ANALYSIS, ): - if auto_chain: + if auto_chain and not _modular_component: if output.resolution == Resolution.OPEN_ENDED_ANALYSIS: queue = RedisQueues.OPEN_ENDED_ANALYSIS_LIST.value downstream_payload = output.data.model_dump_json() @@ -1651,11 +1655,17 @@ async def retry(task, error, input=input, user_triggered=user_triggered): if queue is not None: await fix_await(redis.lpush(queue, downstream_payload)) logger.info(f"Pushed {input.issue} to {queue}") + elif _modular_component: + logger.info( + f"Modular issue {input.issue} — stopping after triage, skipping downstream queue" + ) else: logger.info(f"AUTO_CHAIN disabled, skipping downstream queue for {input.issue}") if output.resolution in _REPRODUCER_ELIGIBLE_RESOLUTIONS: - if enqueue_reproducer: + if _modular_component: + logger.info("Modular issue %s — skipping reproducer queue", input.issue) + elif enqueue_reproducer: async with mcp_tools(os.environ["MCP_GATEWAY_URL"]) as gateway_tools: await _enqueue_reproducer(redis, state, user_triggered, gateway_tools) else: