{"record":{"id":"ebaaf3ef77b1d789","repo":"Significant-Gravitas/AutoGPT","slug":"expert-name-s-schedules-are-paused","errorCode":null,"errorMessage":"{expert.name}'s schedules are paused.","messagePattern":"(.+?)'s schedules are paused\\.","errorType":"exception","errorClass":"ExpertRunPausedError","httpStatus":409,"severity":"warning","filePath":"autogpt_platform/backend/backend/api/features/experts/scheduling.py","lineNumber":303,"sourceCode":"\n    The spend read is a snapshot, not an atomic reservation: N runs firing\n    in the same instant can each pass the check before any of them meters\n    cost. That overshoot is bounded by per-run cost × concurrent firings,\n    the next gate check pauses her, and the durable wallet (credit system)\n    is charged correctly regardless — this gate is a churn guardrail, not\n    the billing ledger, so the simpler check is the deliberate trade-off.\n    \"\"\"\n    expert = await prisma.models.Expert.prisma().find_first(\n        where={\"id\": expert_id, \"ownerUserId\": user_id, \"isTemplate\": False}\n    )\n    if expert is None:\n        return\n    if expert.isArchived:\n        raise ExpertRunPausedError(\n            f\"{expert.name} is archived; her schedules do not run.\", expert_id\n        )\n    if expert.schedulesPausedAt is not None:\n        raise ExpertRunPausedError(f\"{expert.name}'s schedules are paused.\", expert_id)\n    budget = effective_weekly_budget(expert)\n    if budget is None:\n        return\n    spent = await get_weekly_spend(expert_id)\n    if spent >= budget:\n        await pause_expert_schedules(\n            user_id,\n            expert_id,\n            reason=f\"Weekly credit budget reached ({spent}/{budget})\",\n        )\n        await _post_budget_message(user_id, expert, spent, budget, breached=True)\n        raise ExpertRunPausedError(\n            f\"{expert.name} hit her weekly credit budget ({spent}/{budget}); \"\n            \"schedules are paused until you resume them.\",\n            expert_id,\n        )\n    if spent >= int(budget * _BUDGET_WARN_FRACTION):\n        await _post_budget_message(user_id, expert, spent, budget, breached=False)","sourceCodeStart":285,"sourceCodeEnd":321,"githubUrl":"https://github.com/Significant-Gravitas/AutoGPT/blob/9c8bb5550f446ba5d3046b78896578742495b3cf/autogpt_platform/backend/backend/api/features/experts/scheduling.py#L285-L321","documentation":"ExpertRunPausedError raised at scheduling.py:303 when expert.schedulesPausedAt is not None: schedules were previously paused (typically by the weekly-budget breach path or an explicit pause) and the pause has not been resumed. The run is refused at the gate before any cost is metered.","triggerScenarios":"A trigger fires for an expert whose schedulesPausedAt was set earlier — most commonly after error 188 (budget reached) auto-paused her, or after a user-initiated pause — before POST /experts/{id}/schedules/resume was called.","commonSituations":"User hit the weekly credit budget last week, budgets reset, but nobody resumed schedules; stale trigger still attached after a pause; confusion between archived (186) and paused (this) states.","solutions":["Call POST /experts/{expert_id}/schedules/resume (the one-click reversal route) and re-test the trigger.","If the pause came from a budget breach, raise the expert's weekly budget or wait for the spend window to reset before resuming.","Check the expert's state via GET /experts to distinguish paused vs archived before resuming."],"exampleFix":"// before: trigger silently fails with 'schedules are paused'\n// after: resume first, then fire\nawait api.post(`/experts/${expertId}/schedules/resume`);\nawait fireTrigger();","handlingStrategy":"validation","validationCode":"expert = await get_expert(user_id, expert_id)\nif expert and expert.schedules_paused_at is not None:\n    await resume_expert_schedules(user_id, expert_id)  # clear the pause before firing","typeGuard":"def schedule_runnable(e: Expert) -> bool:\n    return (not e.is_archived) and e.schedules_paused_at is None","tryCatchPattern":"try:\n    await run_schedule(...)\nexcept ExpertRunPausedError:\n    await resume_expert_schedules(user_id, expert_id)  # or surface 'paused' to the user","preventionTips":["After any budget breach, call the resume endpoint once spend is acceptable again — pauses never auto-clear.","Surface paused state in the expert UI so users know schedules are inert.","Distinguish paused (resumable) from archived (needs re-hire) before acting."],"tags":["experts","scheduling","paused","backend"],"backgroundTag":null,"analyzedSha":"9c8bb5550f446ba5d3046b78896578742495b3cf","analyzedAt":"2026-08-14T17:17:21.957Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}