Fix: allow agent status change on unassigned tasks

This commit is contained in:
Abhimanyu Saharan
2026-02-15 05:20:32 +00:00
parent 3c8bf27a3f
commit 14a75d8697
2 changed files with 11 additions and 24 deletions

View File

@@ -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

View File

@@ -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()