fix: acknowledge durable submissions before run preparation

This commit is contained in:
2026-09-07 21:38:19 +09:00
parent c76ede2ab4
commit f966470d33
6 changed files with 84 additions and 50 deletions
+10 -22
View File
@@ -1724,14 +1724,13 @@ async fn controller_loop<C, St>(
true,
) {
Ok(acceptance) => {
let _ = working_event_tx.send(Event::SubmissionAccepted {
submission_request_id: acceptance.submission_request_id.clone(),
submission_id: acceptance.submission_id.clone(),
disposition: acceptance.disposition,
});
if let Some(activation) = acceptance.activation {
pending = Some(PendingRun::Submit(activation));
} else {
let _ = working_event_tx.send(Event::SubmissionAccepted {
submission_request_id: acceptance.submission_request_id,
submission_id: acceptance.submission_id,
disposition: acceptance.disposition,
});
}
}
Err(error) => {
@@ -1758,14 +1757,13 @@ async fn controller_loop<C, St>(
true,
) {
Ok(acceptance) => {
let _ = working_event_tx.send(Event::SubmissionAccepted {
submission_request_id: acceptance.submission_request_id.clone(),
submission_id: acceptance.submission_id.clone(),
disposition: acceptance.disposition,
});
if let Some(activation) = acceptance.activation {
pending = Some(PendingRun::Submit(activation));
} else {
let _ = working_event_tx.send(Event::SubmissionAccepted {
submission_request_id: acceptance.submission_request_id,
submission_id: acceptance.submission_id,
disposition: acceptance.disposition,
});
}
}
Err(error) => {
@@ -2481,11 +2479,6 @@ where
if committed.is_ok() {
if let Some(submission) = submission {
pending_submissions.finish_activation(&submission.submission_id);
let _ = working_event_tx.send(Event::SubmissionAccepted {
submission_request_id: submission.submission_request_id,
submission_id: submission.submission_id,
disposition: protocol::SubmissionDisposition::Started,
});
let _ = working_event_tx.send(Event::PendingSubmissionsChanged {
pending: pending_submissions.snapshot(),
});
@@ -2506,11 +2499,6 @@ where
match receiver.try_recv() {
Ok(()) => {
pending_submissions.finish_activation(&submission.submission_id);
let _ = working_event_tx.send(Event::SubmissionAccepted {
submission_request_id: submission.submission_request_id,
submission_id: submission.submission_id,
disposition: protocol::SubmissionDisposition::Started,
});
let _ = working_event_tx.send(Event::PendingSubmissionsChanged {
pending: pending_submissions.snapshot(),
});
+34
View File
@@ -1037,6 +1037,40 @@ permission = "write"
);
}
#[tokio::test]
async fn started_submit_emits_one_durable_acceptance_receipt() {
let worker = make_worker(MockClient::new(simple_text_events())).await;
let handle = spawn_controller(worker).await;
let mut events = handle.subscribe();
let submission_request_id = protocol::new_submission_request_id();
handle
.send(Method::submit_text(submission_request_id.clone(), "start"))
.await
.unwrap();
let mut receipts = Vec::new();
tokio::time::timeout(std::time::Duration::from_secs(2), async {
loop {
match events.recv().await.unwrap() {
Event::SubmissionAccepted {
submission_request_id: received_request_id,
submission_id,
disposition,
} if received_request_id == submission_request_id => {
receipts.push((submission_id, disposition));
}
Event::TurnEnd { .. } => break,
_ => {}
}
}
})
.await
.expect("submitted turn completes");
assert_eq!(receipts.len(), 1);
assert_eq!(receipts[0].1, protocol::SubmissionDisposition::Started);
}
#[tokio::test]
async fn run_end_returns_to_idle_without_busy_status() {
let client = MockClient::new(simple_text_events());