diff --git a/roboco/api/routes/tasks.py b/roboco/api/routes/tasks.py index 889a5bb3..f0a15f1e 100644 --- a/roboco/api/routes/tasks.py +++ b/roboco/api/routes/tasks.py @@ -854,8 +854,9 @@ async def submit_for_qa( status_code=status.HTTP_400_BAD_REQUEST, detail=( "NOT_SELF_VERIFIED: Cannot submit for QA without a prior " - "self-verification step. Call " - "roboco_task_submit_verification() first, then submit_qa." + "self-verification step. Call gateway i_am_done() " + "(handles verification + QA submit), or for the panel " + "POST /api/tasks/{id}/verify before /submit-qa." ), ) if not task.commits: @@ -864,7 +865,7 @@ async def submit_for_qa( detail=( "NO_COMMITS: Cannot submit for QA without at least one " "commit on this task. Use roboco_git_commit() before " - "roboco_task_submit_qa()." + "i_am_done() via gateway, or POST /api/tasks/{id}/submit-qa." ), ) if task.pr_number is None: @@ -881,8 +882,9 @@ async def submit_for_qa( status_code=status.HTTP_400_BAD_REQUEST, detail=( "NO_PROGRESS: Cannot submit for QA without any " - "progress updates. Call roboco_task_progress() at least " - "once during execution before submitting." + "progress updates. Add progress entries via the gateway " + "(i_have_committed auto-records) at least once during " + "execution before submitting." ), ) @@ -953,8 +955,9 @@ async def pass_qa( status_code=status.HTTP_400_BAD_REQUEST, detail=( "NO_PR_ATTACHED: Cannot pass QA without a PR on this " - "task. Use roboco_task_qa_fail(notes='PR not created - " - "dev must push and open PR') so the dev fixes it." + "task. Call gateway fail(task_id, issues=['PR not created'])" + " or POST /api/tasks/{id}/fail-qa with the same issue, " + "so the dev fixes it." ), ) @@ -967,8 +970,9 @@ async def pass_qa( detail=( "QA_NOTES_REQUIRED: QA pass must include notes (>=20 " "chars) summarizing what was verified against the " - "acceptance criteria. Use roboco_task_qa_pass(" - "notes='...')." + "acceptance criteria. Call gateway pass(task_id, " + "notes='...') or POST /api/tasks/{id}/pass-qa with " + "notes set." ), ) @@ -1395,7 +1399,7 @@ async def escalate_task( msg = ( f"Task escalated to {outcome.target_slug} and set to BLOCKED. " - f"PM will receive notification and must call roboco_task_unblock() " + f"PM will receive notification and must call gateway unblock(task_id) " "to provide guidance or reassign." ) return EscalateResponse( diff --git a/roboco/exceptions.py b/roboco/exceptions.py index 1ba91437..b8abad89 100644 --- a/roboco/exceptions.py +++ b/roboco/exceptions.py @@ -218,28 +218,28 @@ class TaskLifecycleError(TaskError): _TRANSITION_HINTS: ClassVar[dict[tuple[str, str], str]] = { ("claimed", "awaiting_documentation"): ( "QA pass skipped the in_progress step. " - "Call `roboco_task_start(task_id)` first, then " - "`roboco_task_qa_pass(task_id, qa_notes=...)`." + "Call gateway i_will_work_on(task_id, plan='...') first, " + "then pass(task_id, notes=...)." ), ("claimed", "awaiting_pm_review"): ( - "Call `roboco_task_start(task_id)` first to move claimed → " - "in_progress, then the handoff tool for your role." + "Call i_will_work_on(task_id, plan='...') first to " + "claimed → in_progress, then the handoff verb for your role." ), ("claimed", "completed"): ( - "Call `roboco_task_start(task_id)` before `roboco_task_complete(task_id)`." + "Call i_will_work_on(task_id, plan='...') before complete(task_id)." ), ("claimed", "needs_revision"): ( "QA fail from claimed needs the start step first. " - "Call `roboco_task_start(task_id)` then " - "`roboco_task_qa_fail(task_id, notes=...)`." + "Call i_will_work_on(task_id, plan='...') then " + "fail(task_id, issues=[...])." ), ("pending", "in_progress"): ( - "Pending tasks must be claimed first. " - "Call `roboco_task_claim(task_id)` then `roboco_task_start`." + "Pending tasks must be claimed + planned first. " + "Call gateway i_will_work_on(task_id, plan='...')." ), ("backlog", "in_progress"): ( - "Activate the task first via " - "`roboco_task_activate(task_id)`, then claim + start." + "Activate the task first: PATCH /api/tasks/{id} " + "(status=pending), then i_will_work_on(task_id, plan='...')." ), }