personal memory agent
1# SPDX-License-Identifier: AGPL-3.0-only
2# Copyright (c) 2026 sol pbc
3
4"""Tests for entity detection and review agent configurations."""
5
6import os
7
8import pytest
9
10from think.talent import get_agent
11
12
13@pytest.fixture
14def fixture_journal():
15 """Set _SOLSTONE_JOURNAL_OVERRIDE to tests/fixtures/journal for testing."""
16 os.environ["_SOLSTONE_JOURNAL_OVERRIDE"] = "tests/fixtures/journal"
17 yield
18 # No cleanup needed - just testing reads
19
20
21def test_entities_agent_config(fixture_journal):
22 """Test detection agent configuration loads correctly."""
23 # Entity agents are in apps/entities/talent/ so use app-qualified name
24 config = get_agent("entities:entities")
25
26 # Verify required fields
27 assert config["name"] == "entities:entities"
28 assert "user_instruction" in config
29 assert len(config["user_instruction"]) > 0
30
31 # Verify JSON metadata fields from entities.json
32 assert config.get("title") == "Entity Detector"
33 assert config.get("schedule") == "daily"
34 assert config.get("priority") == 55
35 assert config.get("multi_facet") is True
36
37
38def test_entities_review_agent_config(fixture_journal):
39 """Test review agent configuration loads correctly."""
40 # Entity agents are in apps/entities/talent/ so use app-qualified name
41 config = get_agent("entities:entities_review")
42
43 # Verify required fields
44 assert config["name"] == "entities:entities_review"
45 assert "user_instruction" in config
46 assert len(config["user_instruction"]) > 0
47
48 # Verify JSON metadata fields from entities_review.json
49 assert config.get("title") == "Entity Reviewer"
50 assert config.get("schedule") == "daily"
51 assert config.get("priority") == 56
52 assert config.get("multi_facet") is True
53
54
55def test_entities_agent_instruction_content(fixture_journal):
56 """Test detection agent instruction contains expected sections."""
57 config = get_agent("entities:entities")
58 prompt = config["user_instruction"]
59
60 # Check for key sections in the agent prompt
61 assert "Core Mission" in prompt
62 assert "sol call entities detect" in prompt
63 assert "sol call entities list" in prompt
64 assert "Knowledge Graphs" in prompt or "knowledge_graph" in prompt
65 assert "day-specific context" in prompt.lower()
66
67
68def test_entities_review_agent_instruction_content(fixture_journal):
69 """Test review agent instruction contains expected sections."""
70 config = get_agent("entities:entities_review")
71 prompt = config["user_instruction"]
72
73 # Check for key sections in the agent prompt
74 assert "Core Mission" in prompt
75 assert "sol call entities attach" in prompt
76 assert "sol call entities list" in prompt
77 assert "3+" in prompt or "promotion" in prompt.lower()
78 assert "description" in prompt.lower()
79
80
81def test_agent_context_includes_entities_by_facet(fixture_journal):
82 """Test that agent context includes entities grouped by facet."""
83 config = get_agent("entities:entities")
84
85 prompt = config["user_instruction"]
86 assert "Available Facets" in prompt
87
88 # Should include facet names in backtick format
89 assert "`test-facet`" in prompt or "`full-featured`" in prompt
90
91 # Should include entities from fixture facets
92 # tests/fixtures/journal/facets/ contains various entities
93 assert "Entities" in prompt
94
95 # Check for some known entities from the fixtures
96 assert "John Smith" in prompt or "Jane Doe" in prompt or "Acme Corp" in prompt
97
98
99def test_agent_context_with_facet_focus(fixture_journal):
100 """Test that get_agent with facet parameter uses focused single-facet context."""
101 config = get_agent("unified", facet="full-featured")
102
103 prompt = config["user_instruction"]
104
105 # Should have Facet Focus section instead of Available Facets
106 assert "## Facet Focus" in prompt
107 assert "Available Facets" not in prompt
108
109 # Should include the focused facet's details
110 assert "Full Featured Facet" in prompt
111 assert "A facet for testing all features" in prompt
112
113 # Should include entity details from the focused facet (detailed format)
114 assert "## Entities" in prompt
115 assert "Entity 1" in prompt or "First test entity" in prompt
116
117
118def test_agent_priority_ordering(fixture_journal):
119 """Test that entity agents have correct priority ordering."""
120 detection_config = get_agent("entities:entities")
121 review_config = get_agent("entities:entities_review")
122
123 detection_priority = detection_config["priority"]
124 review_priority = review_config["priority"]
125
126 # Review should run after detection
127 assert review_priority > detection_priority
128 assert detection_priority == 55
129 assert review_priority == 56