refactor: single ACTIVITIES: block with bullet-level trim (T71.2)
Phase 2 T43 added a SECOND ACTIVITIES: block to render guest activity separately from you+speaker. Two consecutive ACTIVITIES: headers can read as a duplicate-section bug to the LLM and bloat the prompt. Consolidate to a single ACTIVITIES: block whose body is composed from up to three bullets (you, speaker, guest). The block itself is MUST-tier (always renders); bullet-level trim drops bullets in the order guest -> group node -> you -> other edges, with the speaker bullet as the MUST-tier floor (the speaker's own current activity is the load-bearing slice). Implementation chose Option B from the polish plan: pre-truncate the bullets list at trim time before _build_activity_block runs, rather than introduce a granular tier mode in the trim machinery. Rationale documented in code; the existing block-level trim ladder gains a single new toggle (include_you_activity) and the SHOULD-tier guest_activity_block is gone. Tests: - test_single_activities_block_with_three_bullets_when_3_entities: exactly one ACTIVITIES: header with all three entity bullets. - test_tight_budget_drops_guest_activity_bullet_first: speaker bullet survives, guest bullet absent under tight budget. - Existing test_assemble_with_tight_budget_drops_guest_activity_first still passes (asserts on bullet absence, not block-header absence).
This commit is contained in:
@@ -514,6 +514,66 @@ def test_speaker_is_host_uses_host_witness_role(tmp_path, monkeypatch):
|
||||
assert captured["witness_role"] == "host"
|
||||
|
||||
|
||||
def test_single_activities_block_with_three_bullets_when_3_entities(tmp_path):
|
||||
"""T71.2: with you + host + guest present, the assembled prompt
|
||||
contains exactly ONE ``ACTIVITIES:`` header and bullets for all
|
||||
three entities (no duplicate header from the prior dual-block
|
||||
rendering).
|
||||
"""
|
||||
db = tmp_path / "t.db"
|
||||
apply_migrations(db)
|
||||
with open_db(db) as conn:
|
||||
_seed_with_guest(conn)
|
||||
msgs = assemble_narrative_prompt(
|
||||
conn,
|
||||
chat_id="chat_bot_a",
|
||||
speaker_bot_id="bot_a",
|
||||
recent_dialogue=[],
|
||||
retrieved_memory_summaries=[],
|
||||
)
|
||||
body = msgs[0].content
|
||||
# Exactly one ACTIVITIES: header.
|
||||
assert body.count("ACTIVITIES:") == 1
|
||||
# Bullets for all three entities (you=Sam, host=Aria, guest=Iris)
|
||||
# — pin on the unique action verbs from the seed data.
|
||||
assert "finishing emails" in body # you bullet
|
||||
assert "pretending to work" in body # speaker (host) bullet
|
||||
assert "smirking-distinctively" in body # guest bullet
|
||||
|
||||
|
||||
def test_tight_budget_drops_guest_activity_bullet_first(tmp_path):
|
||||
"""T71.2: under tight budget the speaker bullet survives but the
|
||||
guest activity bullet is the first ACTIVITIES: bullet to drop. The
|
||||
block as a whole stays present (it's MUST-tier); only its body
|
||||
contracts.
|
||||
"""
|
||||
db = tmp_path / "t.db"
|
||||
apply_migrations(db)
|
||||
with open_db(db) as conn:
|
||||
_seed_with_guest(conn)
|
||||
dialogue = [
|
||||
{"speaker": "you", "text": "line-16 hi there"},
|
||||
{"speaker": "bot_a", "text": "line-17 hey"},
|
||||
{"speaker": "you", "text": "line-18 quiet night"},
|
||||
{"speaker": "bot_a", "text": "line-19 indeed"},
|
||||
]
|
||||
msgs = assemble_narrative_prompt(
|
||||
conn,
|
||||
chat_id="chat_bot_a",
|
||||
speaker_bot_id="bot_a",
|
||||
recent_dialogue=dialogue,
|
||||
retrieved_memory_summaries=[],
|
||||
budget_soft=250,
|
||||
budget_hard=340,
|
||||
)
|
||||
body = msgs[0].content
|
||||
# Speaker bullet survives (MUST-tier floor).
|
||||
assert "pretending to work" in body
|
||||
assert "ACTIVITIES:" in body
|
||||
# Guest bullet is dropped first under budget pressure.
|
||||
assert "smirking-distinctively" not in body
|
||||
|
||||
|
||||
def test_assemble_with_tight_budget_drops_guest_activity_first(tmp_path):
|
||||
"""Under tight budget MUST blocks survive but SHOULD-tier guest
|
||||
activity is dropped first."""
|
||||
|
||||
Reference in New Issue
Block a user