@@ -213,7 +213,7 @@ def test_all_terminal_after_blocking(self):
213213class TestRunnableNodes :
214214 def test_no_runnable_when_dep_pending (self ):
215215 """Node with PENDING dep is not yet runnable."""
216- from specsmith .agent .dispatch import TaskDAGBuilder , TaskStatus
216+ from specsmith .agent .dispatch import TaskDAGBuilder
217217
218218 dag = TaskDAGBuilder .build (
219219 "f" ,
@@ -249,22 +249,22 @@ def test_both_runnable_after_dep_completed(self):
249249class TestEventEmitter :
250250 def test_emitter_creates_jsonl (self , tmp_path : Path ):
251251 """EventEmitter creates events.jsonl before first node (REQ-328)."""
252- from specsmith .agent .dispatch import DispatchEvent , EventEmitter
252+ from specsmith .agent .dispatch import EventEmitter
253253
254- emitter = EventEmitter (tmp_path , "test-dag-001" )
254+ EventEmitter (tmp_path , "test-dag-001" )
255255 expected = tmp_path / ".specsmith" / "dispatch" / "test-dag-001" / "events.jsonl"
256256 assert expected .exists ()
257257
258258 def test_emit_writes_jsonl_line (self , tmp_path : Path ):
259- from specsmith .agent .dispatch import DispatchEvent , EventEmitter
259+ from specsmith .agent .dispatch import EventEmitter
260260
261261 emitter = EventEmitter (tmp_path , "dag-write" )
262262 emitter .node_started ("node-1" , "coder" )
263263 emitter .node_completed ("node-1" , "rec-abc" , "task done" )
264264 emitter .node_failed ("node-2" , "timeout" )
265265
266266 path = tmp_path / ".specsmith" / "dispatch" / "dag-write" / "events.jsonl"
267- lines = [json .loads (l ) for l in path .read_text ().splitlines () if l .strip ()]
267+ lines = [json .loads (ln ) for ln in path .read_text ().splitlines () if ln .strip ()]
268268 assert len (lines ) == 3
269269 assert lines [0 ]["event_type" ] == "node_started"
270270 assert lines [0 ]["node_id" ] == "node-1"
@@ -576,8 +576,8 @@ def test_events_jsonl_written(self, tmp_path: Path):
576576 jsonl = (
577577 tmp_path / ".specsmith" / "dispatch" / "events-001" / "events.jsonl"
578578 )
579- lines = [json .loads (l ) for l in jsonl .read_text ().splitlines () if l .strip ()]
580- event_types = [l ["event_type" ] for l in lines ]
579+ lines = [json .loads (ln ) for ln in jsonl .read_text ().splitlines () if ln .strip ()]
580+ event_types = [ln ["event_type" ] for ln in lines ]
581581 assert "node_started" in event_types
582582 assert "node_completed" in event_types
583583 assert "dag_done" in event_types
@@ -596,7 +596,6 @@ def test_pre_armed_abort_prevents_execution(self, tmp_path):
596596 AgentPool ,
597597 EventEmitter ,
598598 TaskDAGBuilder ,
599- TaskStatus ,
600599 )
601600
602601 dag = TaskDAGBuilder .build ("job" , dag_id = "abort-pre" )
@@ -618,7 +617,10 @@ def test_pre_armed_abort_prevents_execution(self, tmp_path):
618617
619618 def test_abort_node_returns_false_for_unknown_node (self , tmp_path ):
620619 from specsmith .agent .dispatch import (
621- AgentDispatcher , AgentPool , EventEmitter , TaskDAGBuilder
620+ AgentDispatcher ,
621+ AgentPool ,
622+ EventEmitter ,
623+ TaskDAGBuilder ,
622624 )
623625 dag = TaskDAGBuilder .build ("job" , dag_id = "abort-unknown" )
624626 emitter = EventEmitter (tmp_path , "abort-unknown" )
@@ -632,7 +634,10 @@ def test_abort_node_returns_false_for_unknown_node(self, tmp_path):
632634 def test_abort_flag_checked_after_preflight (self , tmp_path ):
633635 """Abort signalled during governance preflight exits before worker acquire."""
634636 from specsmith .agent .dispatch import (
635- AgentDispatcher , AgentPool , EventEmitter , TaskDAGBuilder , TaskStatus
637+ AgentDispatcher ,
638+ AgentPool ,
639+ EventEmitter ,
640+ TaskDAGBuilder ,
636641 )
637642
638643 dag = TaskDAGBuilder .build ("job" , dag_id = "abort-post-preflight" )
@@ -646,7 +651,9 @@ def _preflight_and_abort(node):
646651 # Simulate preflight setting the abort flag mid-execution
647652 dispatcher .abort_node (node .id )
648653
649- with mock .patch .object (dispatcher , "_governance_preflight" , side_effect = _preflight_and_abort ):
654+ with mock .patch .object (
655+ dispatcher , "_governance_preflight" , side_effect = _preflight_and_abort
656+ ):
650657 summary = dispatcher .run ()
651658
652659 # Worker should never have been acquired
@@ -683,7 +690,10 @@ def test_node_started_payload_contains_depends_on(self, tmp_path):
683690 def test_dispatch_summary_dag_id_traceable (self , tmp_path ):
684691 """DispatchSummary.dag_id must match TaskDAG.dag_id (REQ-315)."""
685692 from specsmith .agent .dispatch import (
686- AgentDispatcher , AgentPool , EventEmitter , TaskDAGBuilder
693+ AgentDispatcher ,
694+ AgentPool ,
695+ EventEmitter ,
696+ TaskDAGBuilder ,
687697 )
688698
689699 dag = TaskDAGBuilder .build ("t" , dag_id = "trace-315" )
@@ -693,8 +703,10 @@ def test_dispatch_summary_dag_id_traceable(self, tmp_path):
693703 dispatcher = AgentDispatcher (
694704 dag , mock_pool , emitter , project_root = tmp_path , max_workers = 1
695705 )
696- with mock .patch .object (dispatcher , "_invoke_worker" ,
697- return_value = {"summary" : "" , "files_changed" : [], "equilibrium" : True }), \
706+ with mock .patch .object (
707+ dispatcher , "_invoke_worker" ,
708+ return_value = {"summary" : "" , "files_changed" : [], "equilibrium" : True },
709+ ), \
698710 mock .patch .object (dispatcher , "_write_esdb_record" , return_value = None ), \
699711 mock .patch .object (dispatcher , "_governance_preflight" ), \
700712 mock .patch .object (dispatcher , "_write_dispatch_ledger" ):
@@ -705,7 +717,10 @@ def test_dispatch_summary_dag_id_traceable(self, tmp_path):
705717 def test_governance_block_in_error (self , tmp_path ):
706718 """Governance block must set error to 'Governance preflight blocked' (REQ-316)."""
707719 from specsmith .agent .dispatch import (
708- AgentDispatcher , AgentPool , EventEmitter , TaskDAGBuilder
720+ AgentDispatcher ,
721+ AgentPool ,
722+ EventEmitter ,
723+ TaskDAGBuilder ,
709724 )
710725
711726 dag = TaskDAGBuilder .build ("t" , dag_id = "gov-316" )
@@ -725,11 +740,12 @@ def test_governance_block_in_error(self, tmp_path):
725740 # REQ-317: context_in populated by _propagate_context
726741 def test_context_injection_traceable (self ):
727742 """After _propagate_context, child.context_in contains parent's esdb_id (REQ-317)."""
743+ import tempfile
744+ from pathlib import Path
745+
728746 from specsmith .agent .dispatch import TaskDAGBuilder , TaskStatus
729747 from specsmith .agent .dispatch .dispatcher import AgentDispatcher , AgentPool
730748 from specsmith .agent .dispatch .events import EventEmitter
731- from pathlib import Path
732- import tempfile
733749
734750 with tempfile .TemporaryDirectory () as tmp :
735751 root = Path (tmp )
@@ -756,6 +772,7 @@ def test_context_injection_traceable(self):
756772 def test_retry_refuses_completed_node (self , tmp_path ):
757773 """dispatch retry --node n1 returns error if n1 is already completed (REQ-318)."""
758774 from click .testing import CliRunner
775+
759776 from specsmith .agent .dispatch import EventEmitter
760777 from specsmith .cli import main
761778
@@ -778,10 +795,8 @@ def test_retry_refuses_completed_node(self, tmp_path):
778795 # REQ-319: ESDB record contains DAG lineage
779796 def test_esdb_record_contains_dag_lineage (self , tmp_path ):
780797 """dispatch_result ChronoRecord MUST include dag_id and node_id (REQ-319)."""
798+ from specsmith .agent .dispatch import EventEmitter , TaskDAGBuilder
781799 from specsmith .agent .dispatch .dispatcher import AgentDispatcher , AgentPool
782- from specsmith .agent .dispatch import (
783- TaskDAGBuilder , EventEmitter , TaskNode , TaskStatus
784- )
785800 from specsmith .esdb .store import ChronoStore
786801
787802 dag = TaskDAGBuilder .build ("t" , dag_id = "esdb-319" )
@@ -807,7 +822,10 @@ def test_esdb_record_contains_dag_lineage(self, tmp_path):
807822 def test_abort_error_contains_aborted (self , tmp_path ):
808823 """Pre-armed abort_node() produces error containing 'Aborted' (REQ-320)."""
809824 from specsmith .agent .dispatch import (
810- AgentDispatcher , AgentPool , EventEmitter , TaskDAGBuilder
825+ AgentDispatcher ,
826+ AgentPool ,
827+ EventEmitter ,
828+ TaskDAGBuilder ,
811829 )
812830
813831 dag = TaskDAGBuilder .build ("t" , dag_id = "abort-320" )
@@ -828,7 +846,10 @@ def test_abort_error_contains_aborted(self, tmp_path):
828846 def test_dispatch_ledger_entry_written (self , tmp_path ):
829847 """AgentDispatcher.run() writes a dispatch ledger entry (REQ-313)."""
830848 from specsmith .agent .dispatch import (
831- AgentDispatcher , AgentPool , EventEmitter , TaskDAGBuilder
849+ AgentDispatcher ,
850+ AgentPool ,
851+ EventEmitter ,
852+ TaskDAGBuilder ,
832853 )
833854
834855 # Create a minimal LEDGER.md so the ledger writer can find it
0 commit comments