From ac3465c656d1cb5bb2503d60d6e8ef5d1cb3813e Mon Sep 17 00:00:00 2001 From: Ajay Krishnan Date: Sat, 25 Jul 2026 09:00:59 -0700 Subject: [PATCH] Fix ID collisions for repeated section titles Large llms-full.txt feeds repeat section headings, which made document identity hashes collide within one source and abort indexing on the documents primary key. Include each document's ordinal in the identity. --- docker/docs/context_docs/refresh.py | 6 ++++-- docker/docs/tests/test_refresh.py | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/docker/docs/context_docs/refresh.py b/docker/docs/context_docs/refresh.py index 92259d6..0fe46df 100644 --- a/docker/docs/context_docs/refresh.py +++ b/docker/docs/context_docs/refresh.py @@ -65,10 +65,12 @@ class RefreshCoordinator: vectors = await self.embedder.encode_documents(texts) if texts else [] documents: list[PreparedDocument] = [] source_host = (urlparse(response.resolved_url).hostname or "").lower() - for parsed_document, vector in zip(parsed.documents, vectors, strict=True): + for ordinal, (parsed_document, vector) in enumerate(zip(parsed.documents, vectors, strict=True)): content_hash = hashlib.sha256(parsed_document.content.encode()).hexdigest() + # Include the ordinal so repeated section titles (common in large + # llms-full.txt feeds) cannot collide on the primary key. identity = "\0".join( - [source, parsed_document.canonical_url, parsed_document.heading_path, str(parsed_document.chunk_index)] + [source, str(ordinal), parsed_document.canonical_url, parsed_document.heading_path, str(parsed_document.chunk_index)] ) documents.append( PreparedDocument( diff --git a/docker/docs/tests/test_refresh.py b/docker/docs/tests/test_refresh.py index fbffd2c..c1a6c3b 100644 --- a/docker/docs/tests/test_refresh.py +++ b/docker/docs/tests/test_refresh.py @@ -91,6 +91,24 @@ class RefreshTest(unittest.IsolatedAsyncioTestCase): self.assertEqual(1, self.store.list_sources()[0].doc_count) self.assertTrue(self.store.lexical_search("Original", limit=5)) + async def test_repeated_section_titles_index_without_id_collisions(self) -> None: + body = "# Basic syntax\n\nFirst variant.\n\n# Basic syntax\n\nSecond variant.\n" + fetcher = FakeFetcher([FakeFetch(200, body)]) + coordinator = RefreshCoordinator( + store=self.store, + fetcher=fetcher, + embedder=FakeEmbedder(), + parser=parse_llms_text, + ttl_seconds=3600, + now=lambda: 100.0, + ) + + outcome = await coordinator.refresh(self.source, force=True) + + self.assertEqual("updated", outcome.status) + self.assertEqual(2, outcome.document_count) + self.assertEqual(2, self.store.list_sources()[0].doc_count) + async def test_empty_success_response_preserves_previous_content(self) -> None: fetcher = FakeFetcher( [