From cfedb8e9cf032fc5ba0f1e2c8f0bb239d51af64d Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 7 Jul 2026 12:04:34 +0000 Subject: [PATCH] =?UTF-8?q?A=20task=20that=20already=20has=20sub=5Ftasks?= =?UTF-8?q?=20refuses=20re-distribution=20=F0=9F=9F=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- backend/app/modelling/router.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/app/modelling/router.py b/backend/app/modelling/router.py index 71e74ae4f..6be284523 100644 --- a/backend/app/modelling/router.py +++ b/backend/app/modelling/router.py @@ -12,7 +12,7 @@ from collections.abc import Callable, Iterator from typing import Any, cast import boto3 -from fastapi import APIRouter, Depends +from fastapi import APIRouter, Depends, HTTPException from sqlmodel import Session from backend.app.config import get_settings @@ -70,6 +70,16 @@ async def trigger_run( session: Session = Depends(get_session), send_messages: MessageSender = Depends(get_message_sender), ) -> dict[str, str]: + subtask_repo = SubTaskPostgresRepository(session) + if subtask_repo.list_by_task(body.task_id): + raise HTTPException( + status_code=409, + detail=( + f"Task {body.task_id} already has sub_tasks — it has been " + "distributed. Check its progress instead of re-triggering." + ), + ) + properties: list[FilteredProperty] = resolve_filtered_property_ids( session, body.portfolio_id, body.filters ) @@ -78,7 +88,6 @@ async def trigger_run( # Pre-create one sub_task per (scenario, batch) message under the # app-owned task, each holding its exact message payload — the fixed # progress denominator and the batch's re-run recipe (ADR-0055). - subtask_repo = SubTaskPostgresRepository(session) subtasks: list[SubTask] = [] payloads: list[dict[str, Any]] = [] for scenario_id in body.scenario_ids: