Python · 1843 bytes Raw Blame History
1 """Tests for typed workflow-signal extraction."""
2
3 from __future__ import annotations
4
5 from loader.runtime.workflow import (
6 WorkflowSignalExtractor,
7 WorkflowTimelineEntry,
8 )
9
10
11 def test_workflow_signal_extractor_captures_recent_timeline_pressure() -> None:
12 extractor = WorkflowSignalExtractor()
13 timeline = [
14 WorkflowTimelineEntry(
15 timestamp="2026-04-07T12:00:00Z",
16 kind="clarify_continue",
17 mode="clarify",
18 reason_code="clarify_follow_up_needed",
19 summary="clarify: clarify pressure remains high",
20 decision_kind="forced",
21 ),
22 WorkflowTimelineEntry(
23 timestamp="2026-04-07T12:01:00Z",
24 kind="reentry",
25 mode="execute",
26 reason_code="verification_failed_reentry",
27 summary="execute: verification failed; returning to execute",
28 decision_kind="reentry",
29 ),
30 WorkflowTimelineEntry(
31 timestamp="2026-04-07T12:02:00Z",
32 kind="verify_skip",
33 mode="verify",
34 reason_code="verification_not_required",
35 summary="verify: verification skipped",
36 decision_kind="forced",
37 ),
38 ]
39
40 signals = extractor.extract_route_signals(
41 "Improve Loader so it feels more like claw-code.",
42 has_brief=True,
43 unresolved_questions=["Scope is still broad."],
44 timeline=timeline,
45 )
46
47 assert signals.ambiguity_score > 0
48 assert signals.has_brief is True
49 assert signals.recent_clarify_count == 1
50 assert signals.recent_reentry_count == 1
51 assert signals.recent_verify_skip_count == 1
52 assert "clarify_brief=available" in signals.signal_summary
53 assert "open_questions=1" in signals.signal_summary
54 assert "recent_reentry=1" in signals.signal_summary
55