feat(prompting): Phase A — suppress the two mush sources in poker mode
Per docs/superpowers/specs/2026-07-01-poker-prompts-design.md, Phase A. Two independent pipeline fixes that reduce mush at the table, ahead of the classifier: 1. _mode_menu_note is no longer injected in poker_cash — mid-session she should not be offering to switch modes. 2. _route skips the register/mood nudge in poker_cash — the lexicon heuristic misfired (neutral logistics like "table broke, 11:50pm" read as tilt/fatigue). Poker register will come from the Phase B MENTAL fragment instead. Non-poker modes keep the nudge unchanged. 2 tests. Full suite 180 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -159,6 +159,9 @@ def build_messages(session_id: str, user_msg: str,
|
|||||||
|
|
||||||
# Mode awareness: she can offer to switch when the work clearly shifts (she decides
|
# Mode awareness: she can offer to switch when the work clearly shifts (she decides
|
||||||
# when — better than a keyword guess). One line, on his yes she calls set_mode.
|
# when — better than a keyword guess). One line, on his yes she calls set_mode.
|
||||||
|
# Suppressed at the live table (poker_cash) — mid-session she shouldn't be offering
|
||||||
|
# to change modes; it's pure noise when the job is logging and coaching.
|
||||||
|
if not (mode and mode.key == "poker_cash"):
|
||||||
messages.append({"role": "system", "content": _mode_menu_note(mode)})
|
messages.append({"role": "system", "content": _mode_menu_note(mode)})
|
||||||
|
|
||||||
# Live ritual state (e.g. Alligator Blood ON) — dynamic, rides with the card.
|
# Live ritual state (e.g. Alligator Blood ON) — dynamic, rides with the card.
|
||||||
@@ -337,6 +340,12 @@ def _route(ctx: TurnContext) -> TurnContext:
|
|||||||
a charged emotional moment adds a per-turn register nudge (deterministic). Most
|
a charged emotional moment adds a per-turn register nudge (deterministic). Most
|
||||||
turns are neutral and get no note — that's the point (don't over-narrate)."""
|
turns are neutral and get no note — that's the point (don't over-narrate)."""
|
||||||
ctx.mode = modes.get(memory.get_session_mode(ctx.session_id))
|
ctx.mode = modes.get(memory.get_session_mode(ctx.session_id))
|
||||||
|
# At the live table the register comes from the poker prompt fragments (esp. the
|
||||||
|
# MENTAL one), not this lexicon nudge — which misfired, reading neutral logistics
|
||||||
|
# ("table broke, it's 11:50pm") as tilt/fatigue. Resolve the mode, but skip the
|
||||||
|
# register/note block in poker_cash. Non-poker modes keep the nudge unchanged.
|
||||||
|
if ctx.mode and ctx.mode.key == "poker_cash":
|
||||||
|
return ctx
|
||||||
m = ctx.moment or {}
|
m = ctx.moment or {}
|
||||||
note = None
|
note = None
|
||||||
if m.get("tilt", 0) >= _TILT_BAR:
|
if m.get("tilt", 0) >= _TILT_BAR:
|
||||||
|
|||||||
@@ -54,3 +54,24 @@ def test_route_quiet_on_neutral_turn(mind):
|
|||||||
turn = mind.assemble("s1", "what did we decide about the schema yesterday?", "cloud", None)
|
turn = mind.assemble("s1", "what did we decide about the schema yesterday?", "cloud", None)
|
||||||
assert turn.register is None # neutral -> no nudge
|
assert turn.register is None # neutral -> no nudge
|
||||||
assert not (turn.moment or {}).get("note")
|
assert not (turn.moment or {}).get("note")
|
||||||
|
|
||||||
|
|
||||||
|
# --- Phase A pipeline fixes: poker mode suppresses the two mush sources ---
|
||||||
|
|
||||||
|
def test_poker_mode_suppresses_tilt_nudge(mind):
|
||||||
|
from lyra import memory
|
||||||
|
memory.set_session_mode("s1", "poker_cash")
|
||||||
|
turn = mind.assemble("s1", "ugh I'm steaming, fucking coolered again!!", "cloud", None)
|
||||||
|
assert turn.register is None # at the table, register comes from fragments
|
||||||
|
sys_blob = " ".join(m["content"] for m in turn.messages if m["role"] == "system")
|
||||||
|
assert "on tilt" not in sys_blob.lower() # false-positive lexicon nudge suppressed
|
||||||
|
|
||||||
|
|
||||||
|
def test_mode_menu_note_suppressed_in_poker(mind):
|
||||||
|
from lyra import modes
|
||||||
|
poker = " ".join(m["content"] for m in mind.build_messages("s1", "stack 350", mode=modes.CASH)
|
||||||
|
if m["role"] == "system")
|
||||||
|
build = " ".join(m["content"] for m in mind.build_messages("s1", "let's refactor", mode=modes.get("build"))
|
||||||
|
if m["role"] == "system")
|
||||||
|
assert "Your modes:" not in poker # no "offer to switch" note at the table
|
||||||
|
assert "Your modes:" in build # still present in a non-poker mode
|
||||||
Reference in New Issue
Block a user