From 718851601af910888ae69c5db9634b92f3402ad2 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Tue, 27 Oct 2026 13:50:03 +0800 Subject: [PATCH] fix(todos): preserve canonical migration refusals at terminal boundaries Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../coordination/local_authority.py | 4 ++-- .../todos/provider_terminal_lifecycle.py | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/loopx/control_plane/coordination/local_authority.py b/loopx/control_plane/coordination/local_authority.py index b4f88c5f5d..06e989e491 100644 --- a/loopx/control_plane/coordination/local_authority.py +++ b/loopx/control_plane/coordination/local_authority.py @@ -78,8 +78,6 @@ def __init__( payload: Mapping[str, Any] | None = None, ) -> None: evidence = { - "goal_id": goal_id, - "operation": operation, "write_admitted": False, "decision_read_from_provider": False, "legacy_fallback_used": False, @@ -88,6 +86,8 @@ def __init__( "backup_required": True, }, **dict(payload or {}), + "goal_id": goal_id, + "operation": operation, } super().__init__( "Canonical authority is required; back up and migrate this Goal before retrying", diff --git a/loopx/control_plane/todos/provider_terminal_lifecycle.py b/loopx/control_plane/todos/provider_terminal_lifecycle.py index de3259de58..eff337a6fb 100644 --- a/loopx/control_plane/todos/provider_terminal_lifecycle.py +++ b/loopx/control_plane/todos/provider_terminal_lifecycle.py @@ -19,6 +19,7 @@ LocalCoordinationAuthorityUnavailable, read_canonical_todos_if_promoted, require_canonical_authority, + raise_canonical_write_failure, ) from ...paths import effective_runtime_root from ..effect_runtime import ( @@ -298,6 +299,9 @@ def terminal_canonical_todo_if_promoted( "legacy_markdown_fallback_allowed": False, "retry_after": "canonical_provider_readback_loaded", } + raise_canonical_write_failure( + {**payload, "error_code": exc.code}, goal_id=goal_id, operation="todo_terminal", + ) raise LocalCoordinationAuthorityUnavailable( str(exc), code=exc.code, payload=payload ) from exc @@ -532,9 +536,15 @@ def archive_canonical_todos_if_promoted( project: Path | None = None, state_file: Path | None = None, ) -> dict[str, Any] | None: - authority_read = read_canonical_todos_if_promoted( - runtime_root=runtime_root, goal_id=goal_id - ) + try: + authority_read = read_canonical_todos_if_promoted( + runtime_root=runtime_root, goal_id=goal_id + ) + except LocalCoordinationAuthorityUnavailable as exc: + raise_canonical_write_failure( + {**exc.payload, "error_code": exc.code}, goal_id=goal_id, operation="todo_archive", + ) + raise if authority_read is None: return None provider_revision = authority_read.get("provider_revision")