fix(navigation): implement zero-trust structural fast paths to eliminate VLM hallucination

This commit is contained in:
2026-04-27 14:00:14 +02:00
parent e9201e0e30
commit 41450c4eaf
9 changed files with 225 additions and 128 deletions

View File

@@ -1,29 +0,0 @@
import os
import shutil
import base64
from unittest.mock import MagicMock, patch
from GramAddict.core.behaviors.simulator import BehaviorSimulator
def test_device_facade_session_trace_cleanup(tmp_path):
facade = BehaviorSimulator()
facade.get_screenshot_b64 = MagicMock(return_value=base64.b64encode(b"fake_jpg_data").decode("utf-8"))
with patch("GramAddict.core.device_facade.os.path.join", side_effect=os.path.join), \
patch("GramAddict.core.device_facade.os.makedirs"):
def fake_join(*args):
if args[0] == "debug" and args[1] == "session_traces":
return str(tmp_path / "session_traces")
return os.path.join(*args)
with patch("GramAddict.core.device_facade.os.path.join", side_effect=fake_join):
traces_root = tmp_path / "session_traces"
traces_root.mkdir(parents=True, exist_ok=True)
for i in range(6):
d = traces_root / f"old_session_{i}"
d.mkdir()
facade.dump_hierarchy()
remaining_folders = [f for f in os.listdir(traces_root) if os.path.isdir(os.path.join(traces_root, f))]
assert len(remaining_folders) <= 5

View File

@@ -24,7 +24,9 @@ def test_dm_engine_uses_correct_dm_memory_logging(monkeypatch):
Note: I am writing this to PROVE the fix is necessary.
"""
mock_device = MagicMock()
mock_device.dump_hierarchy.return_value = "<xml></xml>"
mock_device.dump_hierarchy.return_value = (
'<xml>resource-id="com.instagram.android:id/inbox_refreshable_thread_list_recyclerview"</xml>'
)
mock_telepathic = MagicMock()
# Mock unread thread found
@@ -98,12 +100,12 @@ def test_dm_navigation_double_back_guard():
mock_device = MagicMock()
# Mocking hierarchy sequence
mock_device.dump_hierarchy.side_effect = [
"<xml>Inbox</xml>", # Loop 1 start
"<xml>Thread</xml>", # Context read
"<xml>Thread</xml>", # Send button find
"<xml><node resource-id='com.instagram.android:id/direct_thread_header'/></xml>", # Navigation check AFTER back
"<xml>Inbox</xml>", # Loop 2 start (exit)
"<xml>Inbox</xml>", # Buffer
'<xml>resource-id="com.instagram.android:id/inbox_refreshable_thread_list_recyclerview"</xml>', # Loop 1 start
'<xml>resource-id="com.instagram.android:id/direct_thread_header"</xml>', # Context read
'<xml>resource-id="com.instagram.android:id/direct_thread_header"</xml>', # Send button find
'<xml>resource-id="com.instagram.android:id/direct_thread_header"</xml>', # Navigation check AFTER back
'<xml>resource-id="com.instagram.android:id/inbox_refreshable_thread_list_recyclerview"</xml>', # Loop 2 start (exit)
'<xml>resource-id="com.instagram.android:id/inbox_refreshable_thread_list_recyclerview"</xml>', # Buffer
]
mock_telepathic = MagicMock()