From 205879011a7101ed5e10b7003030f2293fc73638 Mon Sep 17 00:00:00 2001 From: ualtinok <94532+ualtinok@users.noreply.github.com> Date: Wed, 28 Oct 2026 02:46:31 +0100 Subject: [PATCH 1/3] mason: bound rewind replay by deadline with yield Co-authored-by: alfonso-aft <289616620+alfonso-aft@users.noreply.github.com> (cherry picked from commit 96b96e5f9965085ae8ca7e6f172602aada7dfdd2) --- crates/aft/src/runtime_drain.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/crates/aft/src/runtime_drain.rs b/crates/aft/src/runtime_drain.rs index bd1bc80cf..c74297486 100644 --- a/crates/aft/src/runtime_drain.rs +++ b/crates/aft/src/runtime_drain.rs @@ -6785,10 +6785,18 @@ mod tests { drain.join().unwrap(); ctx.mark_subc_bound(); - let mut guard = 0; + // The replay must finish: the manual dispatch channel holds no + // platform watcher, so `has_more` can only come from the retained + // Apply continuation. A bound replay advances every slice; the only + // zero-progress park is transient LSP contention from the + // applicability worker spawned by the initial batch. Yield between + // slices so that worker can release the manager, and bound the wait + // by time rather than a fixed slice count, which is brittle under + // CI load. + let deadline = Instant::now() + Duration::from_secs(5); while drain_watcher_events_bounded(&ctx, WATCHER_PATH_DRAIN_BATCH_CAP).has_more { - guard += 1; - assert!(guard < 32, "rebased replay must finish"); + assert!(Instant::now() < deadline, "rebased replay must finish"); + std::thread::yield_now(); } let search = ctx .search_index() From 5336f7b625268647426b042bee42767441d83acb Mon Sep 17 00:00:00 2001 From: ualtinok <94532+ualtinok@users.noreply.github.com> Date: Wed, 28 Oct 2026 03:11:15 +0100 Subject: [PATCH 2/3] Rewind replay test waits up to 30 s, the suite's standard positive wait Co-authored-by: alfonso-aft <289616620+alfonso-aft@users.noreply.github.com> --- crates/aft/src/runtime_drain.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/aft/src/runtime_drain.rs b/crates/aft/src/runtime_drain.rs index c74297486..c283e60c2 100644 --- a/crates/aft/src/runtime_drain.rs +++ b/crates/aft/src/runtime_drain.rs @@ -6793,7 +6793,7 @@ mod tests { // slices so that worker can release the manager, and bound the wait // by time rather than a fixed slice count, which is brittle under // CI load. - let deadline = Instant::now() + Duration::from_secs(5); + let deadline = Instant::now() + Duration::from_secs(30); while drain_watcher_events_bounded(&ctx, WATCHER_PATH_DRAIN_BATCH_CAP).has_more { assert!(Instant::now() < deadline, "rebased replay must finish"); std::thread::yield_now(); From 0f72e21be7df4eedf6ac1864a496c4e77c17cb47 Mon Sep 17 00:00:00 2001 From: ualtinok <94532+ualtinok@users.noreply.github.com> Date: Wed, 28 Oct 2026 03:11:52 +0100 Subject: [PATCH 3/3] Flake batch 11 search-quality descriptor Co-authored-by: alfonso-aft <289616620+alfonso-aft@users.noreply.github.com> --- .../slice-descriptors/land-flake-batch-11.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 benchmarks/aft-search/slice-descriptors/land-flake-batch-11.json diff --git a/benchmarks/aft-search/slice-descriptors/land-flake-batch-11.json b/benchmarks/aft-search/slice-descriptors/land-flake-batch-11.json new file mode 100644 index 000000000..a39f7240c --- /dev/null +++ b/benchmarks/aft-search/slice-descriptors/land-flake-batch-11.json @@ -0,0 +1,12 @@ +{ + "slice_class": "non_ranking", + "targeted_mechanism": "none", + "kind": "harness", + "fixtures": [ + "harness-goldens" + ], + "slices": [ + "flake-batch-11" + ], + "note": "Test-only: the watcher-drain rewind test waits by time and yields between slices instead of a 32-slice spin. No changed path matches RANKING_FENCE_PREFIXES." +}