From 7be40a33e1ccd1a5af23dfb7acbd612a39221b0e Mon Sep 17 00:00:00 2001 From: Chris Coutinho Date: Sun, 9 Nov 2025 09:03:05 +0100 Subject: [PATCH] fix(vector): Handle missing 'modified' field in notes gracefully MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The vector scanner crashed when encountering notes without a 'modified' field, causing KeyError and preventing initial sync from completing. Changes: - Use dict.get() with fallback value (0) instead of direct key access - Log warnings for notes missing 'modified' field - Apply fix to both initial sync and incremental sync code paths This ensures the scanner continues processing all notes even if some have missing metadata fields, preventing scanner crashes that could affect deployment readiness. Fixes: Notes without 'modified' field causing scanner crash and readiness check failure 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- nextcloud_mcp_server/vector/scanner.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/nextcloud_mcp_server/vector/scanner.py b/nextcloud_mcp_server/vector/scanner.py index b25fd02..72cba68 100644 --- a/nextcloud_mcp_server/vector/scanner.py +++ b/nextcloud_mcp_server/vector/scanner.py @@ -105,13 +105,20 @@ async def scan_user_documents( if initial_sync: # Send everything on first sync for note in notes: + # Handle missing 'modified' field (use 0 as fallback) + modified_at = note.get("modified", 0) + if modified_at == 0: + logger.warning( + f"Note {note['id']} missing 'modified' field, using 0 as fallback" + ) + await send_stream.send( DocumentTask( user_id=user_id, doc_id=str(note["id"]), doc_type="note", operation="index", - modified_at=note["modified"], + modified_at=modified_at, ) ) logger.info(f"Sent {len(notes)} documents for initial sync: {user_id}") @@ -147,6 +154,13 @@ async def scan_user_documents( doc_id = str(note["id"]) indexed_at = indexed_docs.get(doc_id) + # Handle missing 'modified' field (use 0 as fallback) + modified_at = note.get("modified", 0) + if modified_at == 0: + logger.warning( + f"Note {doc_id} missing 'modified' field, using 0 as fallback" + ) + # If document reappeared, remove from potentially_deleted doc_key = (user_id, doc_id) if doc_key in _potentially_deleted: @@ -156,14 +170,14 @@ async def scan_user_documents( del _potentially_deleted[doc_key] # Send if never indexed or modified since last index - if indexed_at is None or note["modified"] > indexed_at: + if indexed_at is None or modified_at > indexed_at: await send_stream.send( DocumentTask( user_id=user_id, doc_id=doc_id, doc_type="note", operation="index", - modified_at=note["modified"], + modified_at=modified_at, ) ) queued += 1