refactor: unified record_turn_memory API with you_present kwarg (T84)
Extends record_turn_memory_for_present with a you_present: bool = True kwarg so a single entry-point covers both you-scenes (witness_you=1) and meanwhile scenes (witness_you=0). Validates that meanwhile callers provide a guest_bot_id. record_meanwhile_memory becomes a thin backward-compat wrapper that delegates with you_present=False, preserving the call site in chat/web/meanwhile.py without churn.
This commit is contained in:
@@ -444,3 +444,91 @@ def test_record_for_present_dict_keys_match(tmp_path):
|
||||
narrative_text="Both bots witness this.",
|
||||
)
|
||||
assert set(result_with_guest.keys()) == {"bot_a", "bot_b"}
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# T84: unified record_turn_memory_for_present API with you_present kwarg.
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_record_turn_memory_you_present_false_writes_meanwhile_witness_mask(tmp_path):
|
||||
"""When ``you_present=False`` the witness mask should be
|
||||
``[you=0, host=1, guest=1]`` for both bots — the meanwhile shape."""
|
||||
db = tmp_path / "t.db"
|
||||
apply_migrations(db)
|
||||
_seed_two_bots(db)
|
||||
with open_db(db) as conn:
|
||||
result = record_turn_memory_for_present(
|
||||
conn,
|
||||
chat_id="chat_ab",
|
||||
host_bot_id="bot_a",
|
||||
guest_bot_id="bot_b",
|
||||
narrative_text="BotA and BotB confer privately.",
|
||||
scene_id=None,
|
||||
chat_clock_at="2026-04-26T20:00:00+00:00",
|
||||
you_present=False,
|
||||
)
|
||||
|
||||
assert set(result.keys()) == {"bot_a", "bot_b"}
|
||||
|
||||
rows = conn.execute(
|
||||
"SELECT owner_id, witness_you, witness_host, witness_guest "
|
||||
"FROM memories ORDER BY owner_id"
|
||||
).fetchall()
|
||||
assert len(rows) == 2
|
||||
for _owner, w_you, w_host, w_guest in rows:
|
||||
assert w_you == 0
|
||||
assert w_host == 1
|
||||
assert w_guest == 1
|
||||
|
||||
# Two memory_written events were appended.
|
||||
cur = conn.execute(
|
||||
"SELECT COUNT(*) FROM event_log WHERE kind = 'memory_written'"
|
||||
)
|
||||
assert cur.fetchone()[0] == 2
|
||||
|
||||
|
||||
def test_record_turn_memory_you_present_true_default_writes_normal_witness_mask(tmp_path):
|
||||
"""Default ``you_present=True`` preserves Phase 2 behaviour:
|
||||
``witness_you=1`` for the host POV row."""
|
||||
db = tmp_path / "t.db"
|
||||
apply_migrations(db)
|
||||
_seed_minimal(db)
|
||||
with open_db(db) as conn:
|
||||
# No explicit you_present arg — should default to True.
|
||||
result = record_turn_memory_for_present(
|
||||
conn,
|
||||
chat_id="chat_bot_a",
|
||||
host_bot_id="bot_a",
|
||||
guest_bot_id=None,
|
||||
narrative_text="BotA hums to herself.",
|
||||
)
|
||||
assert set(result.keys()) == {"bot_a"}
|
||||
|
||||
row = conn.execute(
|
||||
"SELECT witness_you, witness_host, witness_guest "
|
||||
"FROM memories WHERE owner_id = 'bot_a'"
|
||||
).fetchone()
|
||||
assert row is not None
|
||||
w_you, w_host, w_guest = row
|
||||
assert w_you == 1
|
||||
assert w_host == 1
|
||||
assert w_guest == 0
|
||||
|
||||
|
||||
def test_record_turn_memory_you_present_false_requires_guest(tmp_path):
|
||||
"""Calling with ``you_present=False`` and no ``guest_bot_id`` is a
|
||||
programming error — meanwhile scenes always have both bots."""
|
||||
db = tmp_path / "t.db"
|
||||
apply_migrations(db)
|
||||
_seed_minimal(db)
|
||||
with open_db(db) as conn:
|
||||
with pytest.raises(ValueError, match="you_present=False requires guest_bot_id"):
|
||||
record_turn_memory_for_present(
|
||||
conn,
|
||||
chat_id="chat_bot_a",
|
||||
host_bot_id="bot_a",
|
||||
guest_bot_id=None,
|
||||
narrative_text="invalid",
|
||||
you_present=False,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user