Significant-Gravitas/AutoGPT · info · HTTPException

job not found

Error message

job not found

What it means

HTTP 404 from the dream-pass job status endpoint. The route looks up the job via read_status(kind='dream_pass', job_id=job_id); if no status row exists for that exact kind+job_id combination, it returns 404 'job not found'. The job_id must be the UUID returned by the POST that triggered the pass.

Source

Thrown at autogpt_platform/backend/backend/api/features/admin/memory_admin_routes.py:803

)
async def get_dream_pass_status(
    request: Request,
    user_id: Annotated[str, Path(description="User id or 'me'")],
    job_id: Annotated[str, Path(description="Job id returned by the POST")],
    caller_id: Annotated[str, Depends(get_user_id)],
    jwt_payload: Annotated[dict, Security(get_jwt_payload)],
) -> DreamJobStatus:
    """Read the current status of a fire-and-forget dream pass job."""
    target = _resolve_user_id(user_id, caller_id)
    _audit_cross_user_access(
        request=request,
        caller_id=caller_id,
        target_id=target,
        jwt_payload=jwt_payload,
    )
    status = await read_status(kind="dream_pass", job_id=job_id)
    if status is None:
        raise HTTPException(status_code=404, detail="job not found")
    if status.user_id != target:
        raise HTTPException(status_code=403, detail="job belongs to a different user")
    return DreamJobStatus.model_validate(status.model_dump())


@router.post("/{user_id}/ratification", response_model=RatificationResult)
async def trigger_ratification_pass(
    request: Request,
    user_id: Annotated[str, Path(description="User id or 'me'")],
    caller_id: Annotated[str, Depends(get_user_id)],
    jwt_payload: Annotated[dict, Security(get_jwt_payload)],
) -> RatificationResult:
    """Trigger an on-demand ratification sweep for the user (in isolation).

    Forwards to ``Scheduler.execute_ratification_pass_now``. Runs ONLY
    the ratification supersession sweep — does NOT run dream pass or
    community rebuild. Useful for testing ratification behavior
    without the full nightly fan-out.

View on GitHub (pinned to 9c8bb5550f)

Solutions

  1. Confirm you are polling the dream-pass status route with the exact job_id from the POST /{user_id}/dream 202 response body
  2. Verify the status backing store (where read_status persists) is up and was not wiped
  3. Check logs that the POST actually returned 202 and printed the job_id
  4. If the store was reset, re-trigger the dream pass to obtain a fresh job_id
Defensive patterns

Strategy: validation

Validate before calling

from uuid import UUID

def valid_job_id(job_id: str) -> bool:
    try:
        UUID(job_id)
        return True
    except ValueError:
        return False

assert valid_job_id(job_id), "job_id must be the UUID from the trigger response"

Try / catch

except httpx.HTTPStatusError as e:
    if e.response.status_code == 404:
        stop_polling()  # job unknown; re-trigger rather than retry forever
    raise

Prevention

When it happens

Trigger: GET /{user_id}/dream/{job_id}/status with a job_id that was never issued, was issued for a different job kind (e.g. a nightly or rebuild job id), was truncated/copied incorrectly, or whose status record expired or was cleared from storage.

Common situations: Polling with a job_id from a different endpoint family (nightly vs dream_pass); losing the job_id between the 202 response and the status poll (page reload, lost state); status store flushed/reset (Redis restart without persistence) so even valid jobs 404; typos from manual transcription of the UUID.

Related errors


AI-assisted analysis of Significant-Gravitas/AutoGPT@9c8bb5550f (2026-08-14). Data as JSON: /api/errors/c572350146b59bb3. Report an issue: GitHub.