Code review of 1185 (merge 0f4b0c95) found the retry subscriber's central
invariant did not hold: the MergeFailure->Merge bounce caused by its own
retry reset both its attempt counter and the block subscriber's counter,
so the shared merge_failure_block_threshold budget was unreachable and a
deterministic gates failure retried forever.
One subscriber now owns one counter driving both policies:
- Counter survives PipelineEvent::MergeRetryStarted bounces (finding 1);
a third consecutive failure blocks even with retries in between.
- Mixed failure kinds share the single budget (finding 5).
- Retries respect recovery: no counting or scheduling while a mergemaster
is active, and perform_auto_retry re-checks before firing (finding 2).
- perform_auto_retry applies the same eligibility gates as
assign_merge_stage (review hold, frozen, blocked, unmet deps) so freeze
now stops a retry loop (finding 4).
- Per-story scheduling generations invalidate stale sleeping timers
(finding 6).
- One-shot startup scan schedules a catch-up retry for stories already
parked in GatesFailed, so restarts no longer strand them (finding 3);
kept out of the periodic reconciler to avoid re-retrying exhausted
stories every tick.
- Chat is notified only after the merge actually starts; a failed trigger
logs instead of claiming a retry ran (finding 7).
- Config reads moved onto spawn_blocking (finding 8, bug 1170 class).
Deletes merge_failure_retry_subscriber.rs; notification plumbing
(WatcherEvent::MergeAutoRetry et al) is unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019fHdm92yjvguPi2LiXfLB9
29 lines
1.2 KiB
Rust
29 lines
1.2 KiB
Rust
//! Auto-assign submodules: wires focused sub-files and re-exports public items.
|
|
|
|
#[allow(clippy::module_inception)]
|
|
mod auto_assign;
|
|
mod backlog;
|
|
mod merge;
|
|
/// TransitionFired subscriber owning the consecutive-MergeFailure budget:
|
|
/// auto-retries GatesFailed below the threshold, auto-blocks at it.
|
|
pub(crate) mod merge_failure_block_subscriber;
|
|
/// TransitionFired subscriber that auto-spawns mergemaster on ConflictDetected merge failures.
|
|
pub(crate) mod merge_failure_subscriber;
|
|
mod pipeline;
|
|
mod scan;
|
|
mod story_checks;
|
|
pub(crate) mod watchdog;
|
|
|
|
// Re-export items that were pub(super) in the original monolithic auto_assign.rs
|
|
// so that pool::lifecycle and pool::pipeline continue to access them unchanged.
|
|
pub(super) use scan::{find_free_agent_for_stage, is_agent_free};
|
|
|
|
/// Re-export for `startup::tick_loop`.
|
|
pub(crate) use merge_failure_block_subscriber::reconcile_merge_failure_block;
|
|
/// Re-export for `startup::tick_loop`.
|
|
pub(crate) use merge_failure_block_subscriber::spawn_merge_failure_block_subscriber;
|
|
/// Re-export for `startup::tick_loop`.
|
|
pub(crate) use merge_failure_subscriber::reconcile_merge_failure;
|
|
/// Re-export for `startup::tick_loop`.
|
|
pub(crate) use merge_failure_subscriber::spawn_merge_failure_subscriber;
|