fix(bot): close dialog engine gaps (C-SSRS repeat, scale intros, button payloads, step timeout)
CI / ruff · pytest (pull_request) Successful in 1m19s
CI / ruff · pytest (pull_request) Successful in 1m19s
- No same-day C-SSRS repeat: a risk screen completed within cssrs_cooldown_hours is not queued again after PHQ-9 item 9 >= 1 (scale crisis path, rule schedule_scale, scale_due); crisis script and alerts stay. - Scale intro registry: register_scale_intro(scale_id, text_or_fn); start_scale(intro=None) uses it. veteran_daily migrated from per-scale on_enter hooks. - Prefix triggers "button:<prefix>:*" with trigger_payload(event); medication buttons carry the dose (med:taken:<dose_id>, ...), med_pending dropped; payload-less legacy buttons answer as stale. - Abandoned-step timeout: settings.abandon_after_hours (default 6 h) returns abandonable states (daily.*, meds.*, scale.* not in onboarding) to idle before the next event; never in crisis or with intake on. Refs #56 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -292,13 +292,13 @@ async def test_andrey_13_days(andrey: RuleMonitoring) -> None:
|
||||
dose_id = await new_dose(clock.today())
|
||||
reminder = await a.system("med_reminder", dose_id=dose_id, drug="сертралин", dose="50 мг")
|
||||
assert "сертралин 50 мг" in reminder[0].text
|
||||
assert buttons(reminder) == ["med:taken", "med:skip", "med:side_effects"]
|
||||
assert buttons(reminder) == [f"med:taken:{dose_id}", f"med:skip:{dose_id}", f"med:side_effects:{dose_id}"]
|
||||
if taken:
|
||||
r += await a.press("med:taken")
|
||||
r += await a.press(f"med:taken:{dose_id}")
|
||||
else:
|
||||
skip = await a.press("med:skip")
|
||||
assert "med:skip_reason:quit" in buttons(skip)
|
||||
r += skip + await a.press("med:skip_reason:quit")
|
||||
skip = await a.press(f"med:skip:{dose_id}")
|
||||
assert f"med:skip_reason:quit:{dose_id}" in buttons(skip)
|
||||
r += skip + await a.press(f"med:skip_reason:quit:{dose_id}")
|
||||
|
||||
# --- day 7: scheduled scales (PCL-5 = 44, PHQ-9 = 13, item 9 = 0) with friendly intros
|
||||
if day == 7:
|
||||
@@ -359,7 +359,10 @@ async def test_andrey_13_days(andrey: RuleMonitoring) -> None:
|
||||
r = await a.answer_scale("phq9", [2] * 8 + [2]) # total 18, item 9 = 2
|
||||
assert any(x.kind == "crisis" for x in r) and any(x.kind == "safety_plan" for x in r)
|
||||
st, data = await state()
|
||||
assert data["crisis"]["open"] is True and st in ("crisis", "scale.cssrs_screen")
|
||||
# C-SSRS was completed minutes ago: item 9 opens the crisis but does not ask the same screen again (#56).
|
||||
assert data["crisis"]["open"] is True and st == "crisis" and not data.get("pending_scales")
|
||||
async with session.get_clinical_session() as s:
|
||||
assert len(await repo.list_scale_results(s, TOKEN, "cssrs_screen")) == 1
|
||||
acute = [x for x in await open_alerts() if x.level == "acute"]
|
||||
assert [x.code for x in acute] == ["phq9_item9"]
|
||||
assert patient_status(AlertLevel[x.level.upper()] for x in await open_alerts()).color == COLORS[12]
|
||||
|
||||
Reference in New Issue
Block a user