diff --git a/src/ouroboros/auto/interview_driver.py b/src/ouroboros/auto/interview_driver.py index b188d6186..bd54b4072 100644 --- a/src/ouroboros/auto/interview_driver.py +++ b/src/ouroboros/auto/interview_driver.py @@ -32,6 +32,8 @@ log = structlog.get_logger(__name__) +INTERVIEW_SAFE_DEFAULT_SYNTHESIS_STOP_REASON_CODE = "interview_safe_default_synthesis_nonclosure" + @dataclass(frozen=True, slots=True) class InterviewTurn: @@ -431,7 +433,11 @@ async def run(self, state: AutoPipelineState, ledger: SeedDraftLedger) -> AutoIn synthesis_pushed=False, ) state.ledger = ledger.to_dict() - state.mark_blocked(blocker, tool_name="interview.safe_default_synthesis") + state.mark_blocked( + blocker, + tool_name="interview.safe_default_synthesis", + error_code=INTERVIEW_SAFE_DEFAULT_SYNTHESIS_STOP_REASON_CODE, + ) record_authoring_backend(state) self._save(state) return AutoInterviewResult( @@ -446,7 +452,11 @@ async def run(self, state: AutoPipelineState, ledger: SeedDraftLedger) -> AutoIn "backend_done=False, ledger defaults rolled back" ) state.ledger = ledger.to_dict() - state.mark_blocked(blocker, tool_name="interview.safe_default_synthesis") + state.mark_blocked( + blocker, + tool_name="interview.safe_default_synthesis", + error_code=INTERVIEW_SAFE_DEFAULT_SYNTHESIS_STOP_REASON_CODE, + ) record_authoring_backend(state) self._save(state) return AutoInterviewResult( diff --git a/tests/unit/auto/test_interview_pipeline.py b/tests/unit/auto/test_interview_pipeline.py index 7031c292d..31ec1f99a 100644 --- a/tests/unit/auto/test_interview_pipeline.py +++ b/tests/unit/auto/test_interview_pipeline.py @@ -846,6 +846,7 @@ async def answer( assert result.status == "blocked" assert state.interview_completed is False assert "transcript sync failed" in (result.blocker or "") + assert state.last_error_code == "interview_safe_default_synthesis_nonclosure" assert ledger.open_gaps() assert not any( entry.key == f"{section_name}.safe_default_finalization" @@ -881,6 +882,7 @@ async def answer( assert state.interview_completed is False assert state.pending_question == "Still need one more thing" assert "did not close the persisted interview" in (result.blocker or "") + assert state.last_error_code == "interview_safe_default_synthesis_nonclosure" assert ledger.open_gaps() assert not any( entry.key == f"{section_name}.safe_default_finalization"