37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
"""Deterministic reflex layer over events."""
|
|
|
|
from rune.orchestration.reflex import CountReflex, ReflexEngine
|
|
|
|
|
|
def test_reflex_accumulates_deterministic_facts():
|
|
engine = ReflexEngine(CountReflex("turns"))
|
|
engine.process({"event_type": "user.message"})
|
|
engine.process({"event_type": "user.message"})
|
|
engine.process({"event_type": "tool.result"})
|
|
assert engine.facts() == {"turns": 2}
|
|
|
|
|
|
def test_reflex_does_not_reinterpret_intent():
|
|
engine = ReflexEngine(CountReflex("turns"))
|
|
engine.process({"event_type": "work.requested", "unit": "b1"})
|
|
assert engine.facts() == {"turns": 1} # counts events, never judges outcomes
|
|
|
|
|
|
def test_facts_returns_a_copy():
|
|
engine = ReflexEngine(CountReflex("turns"))
|
|
engine.process({"event_type": "x"})
|
|
facts = engine.facts()
|
|
facts["turns"] = 99
|
|
assert engine.facts() == {"turns": 1}
|
|
|
|
|
|
def test_custom_handler_can_emit_availability():
|
|
def handler(state: dict, event: dict) -> dict:
|
|
if event.get("event_type") == "health.report":
|
|
state[event["resource"]] = event["ok"]
|
|
return state
|
|
|
|
engine = ReflexEngine(handler)
|
|
engine.process({"event_type": "health.report", "resource": "ollama", "ok": True})
|
|
assert engine.facts() == {"ollama": True}
|