From 183be2f636ee224168cbc0aebf7b708a98d1b56d Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Mon, 19 Oct 2026 22:32:31 -0400 Subject: [PATCH 1/2] Derive folded phase attribution without inheriting acceptance --- src/agent_comms/todos.py | 4 ++++ tests/test_plan_phases.py | 27 ++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/agent_comms/todos.py b/src/agent_comms/todos.py index ea58133091..28abc2b70d 100644 --- a/src/agent_comms/todos.py +++ b/src/agent_comms/todos.py @@ -1394,6 +1394,10 @@ class FoldedProblemOrder(ProblemOrder): why: str line: ClassVar[str] = "Folded" + @property + def phase(self) -> type[OrderPhase]: + return self.original.phase + def withdrawals(self, todo: Todo) -> tuple[str, ...]: return (f"{todo.id} folded into {self.into}: {self.why}",) diff --git a/tests/test_plan_phases.py b/tests/test_plan_phases.py index 82dfc41aeb..785a3e98eb 100644 --- a/tests/test_plan_phases.py +++ b/tests/test_plan_phases.py @@ -124,7 +124,32 @@ def test_merged_phase_is_inherited_and_round_trips_without_a_wrapper(commander): assert original.phase is RecordPlanePhase assert not order.accepted folded = FoldedProblemOrder(original=original, into="P2", why="Keep one owner") - assert folded.phase is UnplannedPhase + assert folded.phase is RecordPlanePhase + assert not folded.accepted + + +@pytest.mark.parametrize("phase", (CutoverPhase, CommanderPagePhase)) +@pytest.mark.parametrize("installed", (False, True)) +def test_folded_provenance_retains_phase_without_acceptance( + commander, monkeypatch, phase, installed): + todo = create(commander, "P1") + declared = replace(todo, order=todo.order.for_phase(phase)) + monkeypatch.setattr(phase, "task", task(declared)) + original = accepted(declared).order if installed else declared.order + folded = original.folded("P2", "Keep one owner") + nested = folded.folded("P3", "Keep the retained provenance") + for order in (folded, nested): + restored = FieldCodec.decode(ProblemOrder, FieldCodec.encode(order)) + assert restored == order + assert restored.phase is phase + assert not restored.accepted + saved = replace(todo, order=restored, state=DoneTodoState, assignment=None) + assert phase.serving((saved,)) == (saved,) + assert not phase.done((saved,)) + with pytest.raises(ValueError, match="Only a checked order"): + restored.for_phase(UnplannedPhase) + assert original.phase is phase + assert original.accepted is installed def test_closed_related_subtask_does_not_accept_a_whole_phase(commander, monkeypatch): From 9e4a20bd73d8c2377d83c5ec0f879242b7a0fbf7 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Mon, 19 Oct 2026 22:34:22 -0400 Subject: [PATCH 2/2] Exercise provenance through admissible merged and installed states --- tests/test_plan_phases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_plan_phases.py b/tests/test_plan_phases.py index 785a3e98eb..65c52d9601 100644 --- a/tests/test_plan_phases.py +++ b/tests/test_plan_phases.py @@ -135,7 +135,7 @@ def test_folded_provenance_retains_phase_without_acceptance( todo = create(commander, "P1") declared = replace(todo, order=todo.order.for_phase(phase)) monkeypatch.setattr(phase, "task", task(declared)) - original = accepted(declared).order if installed else declared.order + original = accepted(declared).order if installed else declared.order.merged("a" * 40) folded = original.folded("P2", "Keep one owner") nested = folded.folded("P3", "Keep the retained provenance") for order in (folded, nested):