Files
openswarm/backend/tests/test_shutdown_stop_note.py
T

57 lines
2.8 KiB
Python

"""A chat that was running when the backend shut down must say so, or the flush reads as the user's Stop.
2026-09-01: an agent's `pkill -f uvicorn` SIGTERMed Eric's production backend twice; every running chat
was persisted as plain "stopped" and nothing in the transcript said why (row 1, silent work loss)."""
import asyncio
from backend.apps.agents.agent_manager import agent_manager
from backend.apps.agents.core.models import AgentSession, Message
from backend.apps.agents.manager.session import SessionPersistence as sp
def p_session(status: str) -> AgentSession:
s = AgentSession(name="t", model="sonnet", status=status)
s.messages.append(Message(role="user", content="build the thing", branch_id="main"))
return s
def test_a_running_chat_gets_the_shutdown_note_and_stops(monkeypatch, tmp_path) -> None:
saved: dict = {}
monkeypatch.setattr(sp, "save_session", lambda sid, doc: saved.__setitem__(sid, doc))
s = p_session("running")
agent_manager.sessions.clear(); agent_manager.sessions[s.id] = s
asyncio.run(agent_manager.persist_all_sessions())
doc = saved[s.id]
assert doc["status"] == "stopped"
last = doc["messages"][-1]
assert last["role"] == "system", "the note is the platform speaking, never the model"
assert "not your Stop" in last["content"] and "Send a message to continue" in last["content"]
def test_a_settled_chat_is_flushed_untouched(monkeypatch) -> None:
saved: dict = {}
monkeypatch.setattr(sp, "save_session", lambda sid, doc: saved.__setitem__(sid, doc))
s = p_session("completed")
agent_manager.sessions.clear(); agent_manager.sessions[s.id] = s
asyncio.run(agent_manager.persist_all_sessions())
doc = saved[s.id]
assert doc["status"] == "completed"
assert doc["messages"][-1]["role"] == "user", "no note on a chat that was not running"
def test_the_lifespan_stamps_live_turns_before_it_stops_them(monkeypatch) -> None:
"""Placement, not just behaviour: stop_agent flips running -> stopped, so a note keyed on
"running" at flush time never fires for a chat that was a task (dev kill matrix A9a)."""
import inspect
from backend.apps.agents import agents as agents_mod
src = inspect.getsource(agents_mod.agents_lifespan)
assert src.index("note_shutdown_stops()") < src.index("stop_agent(session_id)")
s = p_session("running")
agent_manager.sessions.clear(); agent_manager.sessions[s.id] = s
monkeypatch.setitem(agent_manager.tasks, s.id, object())
try:
assert agent_manager.note_shutdown_stops() == 1
finally:
agent_manager.tasks.pop(s.id, None)
assert s.messages[-1].role == "system" and "not your Stop" in str(s.messages[-1].content)
assert agent_manager.note_shutdown_stops() == 0, "a settled or already-stamped chat is not stamped twice"