{"record":{"id":"1de3f1d949842910","repo":"home-assistant/core","slug":"could-not-find-to-do-item","errorCode":null,"errorMessage":"Could not find To-do item","messagePattern":"Could not find To-do item","errorType":"exception","errorClass":"HomeAssistantError","httpStatus":null,"severity":"error","filePath":"homeassistant/components/caldav/todo.py","lineNumber":194,"sourceCode":"                ),\n            )\n            # refreshing async otherwise it would take too much time\n            self.hass.async_create_task(self.async_update_ha_state(force_refresh=True))\n        except (requests.ConnectionError, requests.Timeout, DAVError) as err:\n            raise HomeAssistantError(f\"CalDAV save error: {err}\") from err\n\n    @override\n    async def async_delete_todo_items(self, uids: list[str]) -> None:\n        \"\"\"Delete To-do items.\"\"\"\n        tasks = (\n            self.hass.async_add_executor_job(self._calendar.todo_by_uid, uid)\n            for uid in uids\n        )\n\n        try:\n            items = await asyncio.gather(*tasks)\n        except NotFoundError as err:\n            raise HomeAssistantError(\"Could not find To-do item\") from err\n        except (requests.ConnectionError, requests.Timeout, DAVError) as err:\n            raise HomeAssistantError(f\"CalDAV lookup error: {err}\") from err\n\n        # Run serially as some CalDAV servers do not support concurrent modifications\n        for item in items:\n            try:\n                await self.hass.async_add_executor_job(item.delete)\n            except (requests.ConnectionError, requests.Timeout, DAVError) as err:\n                raise HomeAssistantError(f\"CalDAV delete error: {err}\") from err\n        # refreshing async otherwise it would take too much time\n        self.hass.async_create_task(self.async_update_ha_state(force_refresh=True))\n","sourceCodeStart":176,"sourceCodeEnd":206,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/caldav/todo.py#L176-L206","documentation":"HomeAssistantError raised in async_delete_todo_items when asyncio.gather over todo_by_uid lookups raises NotFoundError — at least one requested uid does not exist on the server. The whole delete operation aborts (the gather fails fast), so no items are removed.","triggerScenarios":"Calling todo.remove_item / todo.set_value with uids where any one uid was already deleted server-side (multi-select delete after a stale UI list, or another client removed items concurrently).","commonSituations":"Stale to-do list in the HA UI after edits on phone/webmail; scripts deleting by hardcoded uid; server-side auto-clean of completed tasks.","solutions":["Refresh the entity's item list before issuing deletes so uids reflect server state","Delete items one-by-one (or re-select after refresh) so a single stale uid does not abort the batch","If writing automations, resolve uids dynamically from todo.get_items rather than hardcoding them"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"# Resolve uids fresh before a batch delete\nitems = await self.coordinator.async_get_items()  # or todo.get_items service\nlive_uids = {i.uid for i in items}\nuids = [u for u in requested_uids if u in live_uids]","typeGuard":null,"tryCatchPattern":"except NotFoundError as err:\n    raise HomeAssistantError(\"Could not find To-do item\") from err","preventionTips":["Refresh the list immediately before multi-select deletes","Filter stale uids out of batch requests so one missing item cannot abort all","In automations, always look up uids from current entity state"],"tags":["homeassistant","caldav","todo","not-found","batch"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}