From 14a75d8697e44ab9b3fda3dcedaeb11e1cc06a53 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Sun, 15 Feb 2026 05:20:32 +0000 Subject: [PATCH] Fix: allow agent status change on unassigned tasks --- backend/app/api/tasks.py | 10 +------- backend/tests/test_task_agent_permissions.py | 25 ++++++++------------ 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/backend/app/api/tasks.py b/backend/app/api/tasks.py index 79c2d1f3..d5132814 100644 --- a/backend/app/api/tasks.py +++ b/backend/app/api/tasks.py @@ -2075,15 +2075,7 @@ async def _apply_non_lead_agent_task_rules( code="task_board_mismatch", message="Agent can only update tasks for their assigned board.", ) - if ( - update.actor.agent - and "status" in update.updates - and (update.task.assigned_agent_id is None) - ): - raise _task_update_forbidden_error( - code="task_assignee_required", - message="Agents can only change status on tasks assigned to them.", - ) + # Allow agents to claim unassigned tasks by updating status (when permitted by board rules). if ( update.actor.agent and update.task.assigned_agent_id is not None diff --git a/backend/tests/test_task_agent_permissions.py b/backend/tests/test_task_agent_permissions.py index b0ab5d2b..44b3b6e2 100644 --- a/backend/tests/test_task_agent_permissions.py +++ b/backend/tests/test_task_agent_permissions.py @@ -100,7 +100,7 @@ async def test_non_lead_agent_can_update_status_for_assigned_task() -> None: @pytest.mark.asyncio -async def test_non_lead_agent_forbidden_without_assigned_task() -> None: +async def test_non_lead_agent_can_update_status_for_unassigned_task() -> None: engine = await _make_engine() try: async with await _make_session(engine) as session: @@ -127,6 +127,7 @@ async def test_non_lead_agent_forbidden_without_assigned_task() -> None: name="board", slug="board", gateway_id=gateway_id, + only_lead_can_change_status=False, ), ) session.add( @@ -155,21 +156,15 @@ async def test_non_lead_agent_forbidden_without_assigned_task() -> None: actor = (await session.exec(select(Agent).where(col(Agent.id) == actor_id))).first() assert actor is not None - with pytest.raises(HTTPException) as exc: - await tasks_api.update_task( - payload=TaskUpdate(status="in_progress"), - task=task, - session=session, - actor=ActorContext(actor_type="agent", agent=actor), - ) - - assert exc.value.status_code == 403 - assert isinstance(exc.value.detail, dict) - assert exc.value.detail["code"] == "task_assignee_required" - assert ( - exc.value.detail["message"] - == "Agents can only change status on tasks assigned to them." + updated = await tasks_api.update_task( + payload=TaskUpdate(status="in_progress"), + task=task, + session=session, + actor=ActorContext(actor_type="agent", agent=actor), ) + + assert updated.status == "in_progress" + assert updated.assigned_agent_id == actor_id finally: await engine.dispose()