|
@@ -1120,6 +1120,7 @@ def test_gated_out_turn_skips_brief():
|
|
|
service._on_triage_result(gen, _escalated_payload())
|
|
service._on_triage_result(gen, _escalated_payload())
|
|
|
|
|
|
|
|
assert service.last_triage is not None
|
|
assert service.last_triage is not None
|
|
|
|
|
+ assert "brief" not in service.last_triage # no prior brief to retain
|
|
|
assert [e.get("stage") for e in _triage_events(emitted)] == ["signals"]
|
|
assert [e.get("stage") for e in _triage_events(emitted)] == ["signals"]
|
|
|
assert calls == []
|
|
assert calls == []
|
|
|
assert [j.name for j in service._inference._queue] == ["chat"]
|
|
assert [j.name for j in service._inference._queue] == ["chat"]
|
|
@@ -1127,6 +1128,109 @@ def test_gated_out_turn_skips_brief():
|
|
|
assert len(triage.gate_calls) == 1
|
|
assert len(triage.gate_calls) == 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+def test_gated_out_turn_retains_previous_brief():
|
|
|
|
|
+ """A gated-out settled turn keeps the last accepted brief in the panel."""
|
|
|
|
|
+ service, emitted, clock, triage, lane = _triage_service(
|
|
|
|
|
+ triage=FakeTriage(gate=False), brief_fn=lambda prompt: "RAW"
|
|
|
|
|
+ )
|
|
|
|
|
+ service.toggle_chat()
|
|
|
|
|
+ signals = _escalated_payload()
|
|
|
|
|
+ service._last_brief_signals = signals
|
|
|
|
|
+ token = _seed_brief(service, "Unknown: first")
|
|
|
|
|
+ service._run_brief_update(0, signals, service._now(), token)
|
|
|
|
|
+ assert service.last_triage is not None
|
|
|
|
|
+ assert service.last_triage["brief"] == "RAW"
|
|
|
|
|
+ emitted.clear()
|
|
|
|
|
+
|
|
|
|
|
+ service.handle_event(_transcript(clock, "small talk"))
|
|
|
|
|
+ clock.advance(service.cfg.assistant.turn_gap_s + 0.1)
|
|
|
|
|
+ service.tick()
|
|
|
|
|
+ _, _, _, gen = lane.submits[0]
|
|
|
|
|
+
|
|
|
|
|
+ service._on_triage_result(gen, _escalated_payload())
|
|
|
|
|
+
|
|
|
|
|
+ assert service.last_triage is not None
|
|
|
|
|
+ assert service.last_triage["brief"] == "RAW"
|
|
|
|
|
+ assert "brief" not in service._last_brief_signals # raw signals stay raw
|
|
|
|
|
+ staged = [e for e in _triage_events(emitted) if e.get("stage") == "signals"]
|
|
|
|
|
+ assert len(staged) == 1
|
|
|
|
|
+ assert staged[0]["triage"] == service.last_triage
|
|
|
|
|
+ assert staged[0]["triage"]["brief"] == "RAW"
|
|
|
|
|
+ assert len(triage.gate_calls) == 1
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def test_gated_out_turn_retains_brief_when_extract_disabled():
|
|
|
|
|
+ """`extract_enabled = false` skips the dispatch but still retains the brief."""
|
|
|
|
|
+ service, emitted, clock, _, lane = _triage_service(
|
|
|
|
|
+ triage=FakeTriage(gate=False), brief_fn=lambda prompt: "RAW"
|
|
|
|
|
+ )
|
|
|
|
|
+ service.toggle_chat()
|
|
|
|
|
+ signals = _escalated_payload()
|
|
|
|
|
+ service._last_brief_signals = signals
|
|
|
|
|
+ token = _seed_brief(service, "Unknown: first")
|
|
|
|
|
+ service._run_brief_update(0, signals, service._now(), token)
|
|
|
|
|
+ assert service.last_triage is not None
|
|
|
|
|
+ assert service.last_triage["brief"] == "RAW"
|
|
|
|
|
+ service.cfg.triage.extract_enabled = False
|
|
|
|
|
+ emitted.clear()
|
|
|
|
|
+
|
|
|
|
|
+ service.handle_event(_transcript(clock, "small talk"))
|
|
|
|
|
+ clock.advance(service.cfg.assistant.turn_gap_s + 0.1)
|
|
|
|
|
+ service.tick()
|
|
|
|
|
+ _, _, _, gen = lane.submits[0]
|
|
|
|
|
+
|
|
|
|
|
+ service._on_triage_result(gen, _escalated_payload())
|
|
|
|
|
+
|
|
|
|
|
+ assert service.last_triage is not None
|
|
|
|
|
+ assert service.last_triage["brief"] == "RAW"
|
|
|
|
|
+ assert [j.name for j in service._inference._queue] == ["chat"]
|
|
|
|
|
+ staged = [e for e in _triage_events(emitted) if e.get("stage") == "signals"]
|
|
|
|
|
+ assert staged[0]["triage"]["brief"] == "RAW"
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def test_gated_out_turn_retains_brief_without_brief_fn():
|
|
|
|
|
+ """No brief_fn means no dispatch, but a retained brief is still carried."""
|
|
|
|
|
+ service, emitted, clock, _, lane = _triage_service(triage=FakeTriage(gate=False))
|
|
|
|
|
+ service.toggle_chat()
|
|
|
|
|
+ service.last_triage = {**_escalated_payload(), "brief": "KEEP"}
|
|
|
|
|
+ emitted.clear()
|
|
|
|
|
+
|
|
|
|
|
+ service.handle_event(_transcript(clock, "small talk"))
|
|
|
|
|
+ clock.advance(service.cfg.assistant.turn_gap_s + 0.1)
|
|
|
|
|
+ service.tick()
|
|
|
|
|
+ _, _, _, gen = lane.submits[0]
|
|
|
|
|
+
|
|
|
|
|
+ service._on_triage_result(gen, _escalated_payload())
|
|
|
|
|
+
|
|
|
|
|
+ assert service.last_triage["brief"] == "KEEP"
|
|
|
|
|
+ staged = [e for e in _triage_events(emitted) if e.get("stage") == "signals"]
|
|
|
|
|
+ assert staged[0]["triage"]["brief"] == "KEEP"
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def test_later_accepted_update_replaces_retained_brief():
|
|
|
|
|
+ """A later accepted update overwrites the retained brief text."""
|
|
|
|
|
+ texts = iter(["OLD", "NEW"])
|
|
|
|
|
+ service, emitted, _, _, _ = _triage_service(brief_fn=lambda prompt: next(texts))
|
|
|
|
|
+ service.toggle_chat()
|
|
|
|
|
+ signals = _escalated_payload()
|
|
|
|
|
+ service._last_brief_signals = signals
|
|
|
|
|
+ token = _seed_brief(service, "Unknown: first")
|
|
|
|
|
+ service._run_brief_update(0, signals, service._now(), token)
|
|
|
|
|
+ assert service.last_triage is not None
|
|
|
|
|
+ assert service.last_triage["brief"] == "OLD"
|
|
|
|
|
+
|
|
|
|
|
+ token = _seed_brief(service, "Unknown: second")
|
|
|
|
|
+ service._run_brief_update(0, signals, service._now(), token)
|
|
|
|
|
+
|
|
|
|
|
+ assert service.last_triage is not None
|
|
|
|
|
+ assert service.last_triage["brief"] == "NEW"
|
|
|
|
|
+ contents = [e for e in _triage_events(emitted) if e.get("stage") == "content"]
|
|
|
|
|
+ assert contents[-1]["triage"]["brief"] == "NEW"
|
|
|
|
|
+
|
|
|
|
|
+ service.clear()
|
|
|
|
|
+ assert service.last_triage is None
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
def test_no_brief_when_disabled_in_config():
|
|
def test_no_brief_when_disabled_in_config():
|
|
|
calls: list[str] = []
|
|
calls: list[str] = []
|
|
|
service, _, clock, _, lane = _triage_service(
|
|
service, _, clock, _, lane = _triage_service(
|