{"record":{"id":"5d56f79314e309d9","repo":"langchain-ai/deepagents","slug":"context-hub-mutation-deadline-is-missing","errorCode":null,"errorMessage":"Context Hub mutation deadline is missing","messagePattern":"Context Hub mutation deadline is missing","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"libs/deepagents/deepagents/backends/context_hub.py","lineNumber":239,"sourceCode":"    @staticmethod\n    def _wait_for_mutation(mutation: _Mutation) -> None:\n        mutation.done.wait()\n        if mutation.error is not None:\n            raise mutation.error\n\n    def _submit_changes(self, changes: dict[str, str | None]) -> None:\n        with self._mutations.condition:\n            self._ensure_cache_locked()\n            mutation = self._queue_changes_locked(changes)\n        self._wait_for_mutation(mutation)\n\n    def _take_batch(self) -> list[_Mutation] | None:\n        queue = self._mutations\n        with queue.condition:\n            while queue.pending:\n                if queue.deadline is None:\n                    msg = \"Context Hub mutation deadline is missing\"\n                    raise RuntimeError(msg)\n                remaining = queue.deadline - time.monotonic()\n                if remaining > 0:\n                    queue.condition.wait(timeout=remaining)\n                    continue\n                batch = queue.pending\n                queue.pending = []\n                queue.deadline = None\n                queue.in_flight = batch\n                return batch\n            self._worker = None\n            return None\n\n    @staticmethod\n    def _merge_batch(batch: list[_Mutation]) -> dict[str, str | None]:\n        changes: dict[str, str | None] = {}\n        for mutation in batch:\n            changes.update(mutation.changes)\n        return changes","sourceCodeStart":221,"sourceCodeEnd":257,"githubUrl":"https://github.com/langchain-ai/deepagents/blob/a1af029e6e73cb17c36bff823d227747b28e91e1/libs/deepagents/deepagents/backends/context_hub.py#L221-L257","documentation":"`_take_batch` waits on the mutation queue's condition until the queue's deadline expires, then drains `queue.pending`. If pending mutations exist but `queue.deadline` is `None`, the batching invariant is broken (a deadline must always be set when mutations are enqueued), so it raises `RuntimeError` instead of waiting forever.","triggerScenarios":"The mutation-draining loop (`_drain_mutations` → `_take_batch`) encounters a queue with pending entries whose deadline was never set — a bug in enqueue ordering or a queue constructed/mutated outside the expected `deadline`-setting path.","commonSituations":"Concurrent enqueue racing with drain such that pending is visible before the deadline is assigned; custom code poking at internal `_mutations` queue; library-version mismatch where one component sets pending without a deadline.","solutions":["Upgrade/align library versions so enqueue always sets a deadline before appending pending mutations.","Avoid touching the internal `_mutations` queue directly; use the public submit APIs that schedule the deadline.","Report/reproduce as a concurrency bug if it occurs on stock APIs — the fix belongs in enqueue ordering."],"exampleFix":"// before (incorrect internal enqueue)\nqueue.pending.append(mutation)  # deadline never set\n// after\nqueue.deadline = time.monotonic() + BATCH_WINDOW\nqueue.pending.append(mutation)\nqueue.condition.notify_all()","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    backend.submit_changes(changes)\nexcept RuntimeError as e:\n    if \"mutation deadline is missing\" in str(e):\n        recreate_backend_and_resubmit(changes)  # internal invariant violated; rebuild state\n    else:\n        raise","preventionTips":["Do not mutate the internal `_mutations` queue directly; use public submit APIs.","Keep all components on the same library version to avoid mismatched queue invariants.","Report this as a bug with a repro if it occurs on stock APIs — it indicates an enqueue-ordering race."],"tags":["context-hub","concurrency","batching","internal-invariant"],"backgroundTag":"missing-batch-deadline","analyzedSha":"a1af029e6e73cb17c36bff823d227747b28e91e1","analyzedAt":"2026-08-29T11:43:24.718Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}