From f4226047cb7f3dc3caf5238acb5cf1febf1a8777 Mon Sep 17 00:00:00 2001 From: shafdev <96260000+shafdev@users.noreply.github.com> Date: Mon, 13 Apr 2026 10:10:46 +0530 Subject: [PATCH] fix: hash full content in tool_add_drawer drawer ID (#716) * fix: hash full content in tool_add_drawer drawer ID * style: apply ruff format * style: fix ruff format for CI ruff 0.4.x --- mempalace/mcp_server.py | 4 +++- tests/test_mcp_server.py | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/mempalace/mcp_server.py b/mempalace/mcp_server.py index 9725043..ef7e4e8 100644 --- a/mempalace/mcp_server.py +++ b/mempalace/mcp_server.py @@ -481,7 +481,9 @@ def tool_add_drawer( if not col: return _no_palace() - drawer_id = f"drawer_{wing}_{room}_{hashlib.sha256((wing + room + content[:100]).encode()).hexdigest()[:24]}" + drawer_id = ( + f"drawer_{wing}_{room}_{hashlib.sha256((wing + room + content).encode()).hexdigest()[:24]}" + ) _wal_log( "add_drawer", diff --git a/tests/test_mcp_server.py b/tests/test_mcp_server.py index 32bc7c6..933dd68 100644 --- a/tests/test_mcp_server.py +++ b/tests/test_mcp_server.py @@ -401,6 +401,29 @@ class TestWriteTools: assert result2["success"] is True assert result2["reason"] == "already_exists" + def test_add_drawer_shared_header_no_collision(self, monkeypatch, config, palace_path, kg): + """Documents sharing a >100-char header must get distinct IDs (full-content hash).""" + _patch_mcp_server(monkeypatch, config, kg) + _client, _col = _get_collection(palace_path, create=True) + del _client + from mempalace.mcp_server import tool_add_drawer + + header = "# ACME Corp Knowledge Base\n**Project:** Alpha | **Team:** Backend | **Status:** Active\n\n" + doc1 = ( + header + + "Decision: Use PostgreSQL for primary storage. Rationale: ACID compliance required." + ) + doc2 = header + "Decision: Use Redis for session caching. Rationale: sub-ms latency needed." + + result1 = tool_add_drawer(wing="work", room="decisions", content=doc1) + result2 = tool_add_drawer(wing="work", room="decisions", content=doc2) + + assert result1["success"] is True + assert result2["success"] is True + assert ( + result1["drawer_id"] != result2["drawer_id"] + ), "Documents with shared header but different content must have distinct drawer IDs" + def test_delete_drawer(self, monkeypatch, config, palace_path, seeded_collection, kg): _patch_mcp_server(monkeypatch, config, kg) from mempalace.mcp_server import tool_delete_drawer