async def METHOD_NAME(
    services_endpoint: dict[str, URL]
) -> Callable[[UserID, str], Awaitable[None]]:
    async def _waiter(user_id: UserID, product_name: str) -> None:
        catalog_endpoint = list(
            filter(
                lambda service_endpoint: "catalog" in service_endpoint[0],
                services_endpoint.items(),
            )
        )
        assert (
            len(catalog_endpoint) == 1
        ), f"no catalog service found! {services_endpoint=}"
        catalog_endpoint = catalog_endpoint[0][1]
        print(f"--> found catalog endpoint at {catalog_endpoint=}")
        client = httpx.AsyncClient()
        @retry(
            wait=wait_fixed(1),
            stop=stop_after_delay(60),
            retry=retry_if_exception_type(AssertionError),
        )
        async def _ensure_catalog_services_answers() -> None:
            print("--> checking catalog is up and ready...")
            response = await client.get(
                f"{catalog_endpoint}/v0/services",
                params={"details": False, "user_id": user_id},
                headers={"x-simcore-products-name": product_name},
            )
            assert (
                response.status_code == status.HTTP_200_OK
            ), f"catalog is not ready {response.status_code}:{response.text}, TIP: migration not completed or catalog broken?"
            services = response.json()
            assert services != [], "catalog is not ready: no services available"
            print(
                f"<-- catalog is up and ready, received {response.status_code}:{response.text}"
            )
        await _ensure_catalog_services_answers()
    return _waiter