tenseleyflow/loader / 0b4b303

Browse files

Adopt runtime context for turn finalization

Authored by espadonne
SHA
0b4b303bcd34d711cd537d38070fad7a871e05f9
Parents
2be9f86
Tree
f1df3d2

1 changed file

StatusFile+-
M src/loader/runtime/finalization.py 18 17
src/loader/runtime/finalization.pymodified
@@ -8,6 +8,7 @@ from datetime import UTC, datetime
88
 from pathlib import Path
99
 
1010
 from ..llm.base import Message, Role, ToolCall
11
+from .context import RuntimeContext
1112
 from .dod import (
1213
     DefinitionOfDone,
1314
     DefinitionOfDoneStore,
@@ -49,23 +50,23 @@ class TurnFinalizer:
4950
 
5051
     def __init__(
5152
         self,
52
-        agent,
53
+        context: RuntimeContext,
5354
         tracer: RuntimeTracer,
5455
         dod_store: DefinitionOfDoneStore,
5556
         set_workflow_mode: WorkflowSetter,
5657
     ) -> None:
57
-        self.agent = agent
58
+        self.context = context
5859
         self.tracer = tracer
5960
         self.dod_store = dod_store
6061
         self.set_workflow_mode = set_workflow_mode
6162
 
6263
     @property
6364
     def _prompt_format(self) -> str | None:
64
-        return getattr(self.agent, "prompt_format", None)
65
+        return self.context.prompt_format
6566
 
6667
     @property
6768
     def _prompt_sections(self) -> list[str]:
68
-        return list(getattr(self.agent, "prompt_sections", []))
69
+        return list(self.context.prompt_sections)
6970
 
7071
     async def run_definition_of_done_gate(
7172
         self,
@@ -93,7 +94,7 @@ class TurnFinalizer:
9394
             pending_text = "\n".join(f"- {item}" for item in tracked_pending_items)
9495
             self.dod_store.save(dod)
9596
             await self.emit_dod_status(emit, dod)
96
-            self.agent.session.append(
97
+            self.context.session.append(
9798
                 Message(
9899
                     role=Role.USER,
99100
                     content=(
@@ -111,11 +112,11 @@ class TurnFinalizer:
111112
             dod.last_verification_result = "skipped"
112113
             summary.verification_status = "skipped"
113114
             summary.definition_of_done = dod
114
-            self.agent.session.append_workflow_timeline_entry(
115
+            self.context.session.append_workflow_timeline_entry(
115116
                 WorkflowTimelineEntry(
116117
                     timestamp=datetime.now(UTC).strftime("%Y-%m-%dT%H:%M:%SZ"),
117118
                     kind=WorkflowTimelineEntryKind.VERIFY_SKIP.value,
118
-                    mode=self.agent.workflow_mode,
119
+                    mode=self.context.workflow_mode,
119120
                     reason_code="verification_not_required",
120121
                     summary="verification skipped because the turn made no mutating changes",
121122
                     decision_kind=WorkflowDecisionKind.FORCED.value,
@@ -123,7 +124,7 @@ class TurnFinalizer:
123124
                     prompt_sections=self._prompt_sections,
124125
                 )
125126
             )
126
-            summary.workflow_timeline = list(self.agent.session.workflow_timeline)
127
+            summary.workflow_timeline = list(self.context.session.workflow_timeline)
127128
             self.dod_store.save(dod)
128129
             await self.emit_dod_status(emit, dod)
129130
             return CompletionGateResult(
@@ -147,7 +148,7 @@ class TurnFinalizer:
147148
         if not dod.verification_commands:
148149
             dod.verification_commands = derive_verification_commands(
149150
                 dod,
150
-                project_root=self.agent.project_root,
151
+                project_root=self.context.project_root,
151152
                 task_statement=dod.task_statement,
152153
             )
153154
 
@@ -235,7 +236,7 @@ class TurnFinalizer:
235236
             f"{build_verification_summary(dod.evidence)}\n\n"
236237
             "Fix the failures above, then finish the task again."
237238
         )
238
-        self.agent.session.append(Message(role=Role.USER, content=failure_prompt))
239
+        self.context.session.append(Message(role=Role.USER, content=failure_prompt))
239240
         return CompletionGateResult(should_continue=True, final_response="")
240241
 
241242
     async def verify_definition_of_done(
@@ -262,7 +263,7 @@ class TurnFinalizer:
262263
             verification_call = ToolCall(
263264
                 id=f"verify-{summary.iterations}-{index}",
264265
                 name="bash",
265
-                arguments={"command": command, "cwd": str(self.agent.project_root)},
266
+                arguments={"command": command, "cwd": str(self.context.project_root)},
266267
             )
267268
             await emit(
268269
                 AgentEvent(
@@ -304,7 +305,7 @@ class TurnFinalizer:
304305
             dod.evidence.append(evidence)
305306
             all_passed = all_passed and evidence.passed
306307
             summary.tool_result_messages.append(outcome.message)
307
-            self.agent.session.append(outcome.message)
308
+            self.context.session.append(outcome.message)
308309
 
309310
         self.dod_store.save(dod)
310311
         summary.verification_status = "passed" if all_passed else "failed"
@@ -315,20 +316,20 @@ class TurnFinalizer:
315316
 
316317
         summary.usage["tool_calls"] = len(summary.tool_result_messages)
317318
         summary.usage["iterations"] = summary.iterations
318
-        summary.cumulative_usage = self.agent.session.record_turn_usage(
319
+        summary.cumulative_usage = self.context.session.record_turn_usage(
319320
             summary.usage,
320321
             tool_calls=len(summary.tool_result_messages),
321322
             iterations=summary.iterations,
322323
         )
323
-        summary.session_id = self.agent.session.session_id
324
+        summary.session_id = self.context.session.session_id
324325
         summary.last_turn_transition_summary = (
325
-            getattr(self.agent.session, "last_turn_transition_summary", None)
326
+            getattr(self.context.session, "last_turn_transition_summary", None)
326327
         )
327328
         summary.workflow_timeline = list(
328
-            getattr(self.agent.session, "workflow_timeline", [])
329
+            getattr(self.context.session, "workflow_timeline", [])
329330
         )
330331
         if summary.definition_of_done and summary.definition_of_done.status == "done":
331
-            MemoryStore(self.agent.project_root).capture_definition_of_done(
332
+            MemoryStore(self.context.project_root).capture_definition_of_done(
332333
                 build_verification_summary(summary.definition_of_done.evidence)
333334
             )
334335
         summary.trace = list(self.tracer.events)