From 06c03e407a1944c29c983d87688f1b5fae560e7f Mon Sep 17 00:00:00 2001
From: x
Date: Tue, 20 Oct 2026 03:27:56 -0400
Subject: [PATCH 1/2] P757: require the matched merge to follow the current
order
---
src/agent_comms/todos.py | 9 +++++----
tests/test_order_progress.py | 24 ++++++++++++++++++++++++
2 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/src/agent_comms/todos.py b/src/agent_comms/todos.py
index c6876fbc1f..2541984209 100644
--- a/src/agent_comms/todos.py
+++ b/src/agent_comms/todos.py
@@ -328,7 +328,7 @@ def belongs_to(self, todo: Todo) -> bool:
return (todo.id in self.problems
or any(identity in self.orders for identity in todo.held_order_ids))
- def merged_commits(self) -> Iterator[str]:
+ def merged_commits(self, since: float) -> Iterator[str]:
return iter(())
async def delivery_merges(self, delivery: CommitDelivery,
@@ -345,8 +345,9 @@ class MergedPullRequest(PullRequest):
merge: str
merged_at: float
- def merged_commits(self) -> Iterator[str]:
- yield self.merge
+ def merged_commits(self, since: float) -> Iterator[str]:
+ if self.merged_at >= since:
+ yield self.merge
async def delivery_merges(self, delivery: CommitDelivery,
check: OrderCheck) -> tuple[DeliveryMerge, ...]:
@@ -930,7 +931,7 @@ class MergedProgress(FoundProgress):
@classmethod
def found(cls, source: ProgressSource) -> Iterator[Self]:
return (cls(sha) for pr in source.requests("merged")
- for sha in pr.merged_commits())
+ for sha in pr.merged_commits(source.since))
@property
def state(self) -> str:
diff --git a/tests/test_order_progress.py b/tests/test_order_progress.py
index 4cddca923c..e3d1eb8c1d 100644
--- a/tests/test_order_progress.py
+++ b/tests/test_order_progress.py
@@ -119,6 +119,30 @@ def test_unfinished_check_keeps_other_overdue_orders_visible(
todo.order.check.result.require(run)
+@pytest.mark.parametrize('merged_at', (200.0, 201.0))
+def test_reissued_order_rejects_earlier_merge_and_accepts_its_own(
+ checkout, commander, merged_at):
+ first, unit = checkout
+ sha = commit(unit)
+ earlier = MergedPullRequest(7, 'fix/p1', sha, merge=sha, merged_at=150.0,
+ updated_at=150.0, orders=(first.order.id,))
+ comms, caller = commander
+ following = replace(first.order, id='resent-P1', at=RecordedEventTime(200.0))
+ CommsOrderTool(owner='worker', order=OrderGoalAction(
+ problem='P1', order=following, request='request', deadline=RecordedEventTime(3000),
+ commander='lead', expected_revision=first.revision,
+ assigner=comms.registry.require('lead').incarnation)).apply(comms, caller)
+ current = comms.goals.todos.get('P1')
+ assert current.prior_orders == (first.order,)
+ assert not isinstance(read((current, unit), Listed(merged=(earlier,))), MergedProgress)
+ assert comms.goals.todos.get('P1') == current and current.state.open
+ assert tuple(earlier.merged_commits(200.0)) == ()
+ later = replace(earlier, number=8, merged_at=merged_at, updated_at=merged_at,
+ orders=(following.id,))
+ assert tuple(later.merged_commits(200.0)) == (sha,)
+ assert read((current, unit), Listed(merged=(earlier, later))) == MergedProgress(sha)
+
+
def test_no_commit_since_the_order_is_explicit(checkout):
progress = read(checkout)
assert progress == NoCommitProgress()
From 9a7b19e5b1e00d6a47729c2dc8725b4110bdaa72 Mon Sep 17 00:00:00 2001
From: x
Date: Tue, 20 Oct 2026 03:31:57 -0400
Subject: [PATCH 2/2] P757: restore the Todo writer maintenance admission
import
---
src/agent_comms/todos.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/agent_comms/todos.py b/src/agent_comms/todos.py
index 2541984209..3e155a81a1 100644
--- a/src/agent_comms/todos.py
+++ b/src/agent_comms/todos.py
@@ -49,6 +49,7 @@
)
from .goals import CheckedCommit, OrderCheck, ProblemGoalOrder
from .launch_runtime import BuildIdentity, UnrecordedBuildIdentity
+from .maintenance_barrier import MaintenanceBarrier
from .order_story import ProblemStory, StoryEvent, StoryLine, StorySource
from .plan_phases import OrderPhase, UnplannedPhase
from .recorded_time import EventTime, RecordedEventTime, UnrecordedEventTime