diff --git a/src/ClaudeDo.Ui/ViewModels/MissionControl/ConPtyPaneViewModel.cs b/src/ClaudeDo.Ui/ViewModels/MissionControl/ConPtyPaneViewModel.cs
index e66d8b11..9d37abe2 100644
--- a/src/ClaudeDo.Ui/ViewModels/MissionControl/ConPtyPaneViewModel.cs
+++ b/src/ClaudeDo.Ui/ViewModels/MissionControl/ConPtyPaneViewModel.cs
@@ -40,10 +40,14 @@ public sealed partial class ConPtyPaneViewModel : ViewModelBase, IDisposable
}
/// Set by the host for a list-handler run ("Let Claude handle it" / "Let Claude merge
- /// the reviews") pane -- shows the "Abandon run" action. Plain mutable property, not
- /// : the host sets it once right after construction, before the
- /// pane is added to the visible collection, so no change notification is needed.
- public bool IsListHandler { get; set; }
+ /// the reviews") pane -- shows the "Abandon run" action and hides the manual submit button.
+ [ObservableProperty]
+ [NotifyPropertyChangedFor(nameof(ShowSubmitForReview))]
+ private bool _isListHandler;
+
+ /// Whether the header shows "Submit for review": task-based, and not a list handler
+ /// (the handler submits its own task at the end of its merge phase).
+ public bool ShowSubmitForReview => IsTaskBased && !IsListHandler;
[ObservableProperty] private string _displayTitle;
diff --git a/src/ClaudeDo.Ui/Views/MissionControl/ConPtyPaneView.axaml b/src/ClaudeDo.Ui/Views/MissionControl/ConPtyPaneView.axaml
index fcc665d1..738b1fa5 100644
--- a/src/ClaudeDo.Ui/Views/MissionControl/ConPtyPaneView.axaml
+++ b/src/ClaudeDo.Ui/Views/MissionControl/ConPtyPaneView.axaml
@@ -26,7 +26,7 @@
Foreground="{DynamicResource TextDimBrush}"
VerticalAlignment="Center" Margin="4,0,0,0" />
diff --git a/tests/ClaudeDo.Ui.Tests/ViewModels/MissionControlViewModelTests.cs b/tests/ClaudeDo.Ui.Tests/ViewModels/MissionControlViewModelTests.cs
index 57279f33..0a493f31 100644
--- a/tests/ClaudeDo.Ui.Tests/ViewModels/MissionControlViewModelTests.cs
+++ b/tests/ClaudeDo.Ui.Tests/ViewModels/MissionControlViewModelTests.cs
@@ -1143,6 +1143,19 @@ public class MissionControlViewModelTests : IDisposable
}
}
+ // The handler submits its own task, so only a non-handler task-based pane shows the button.
+ [Fact]
+ public async Task ShowSubmitForReview_FalseForListHandler_TrueForNormalTaskPane()
+ {
+ var worker = new RecordingAbandonWorker();
+ using var vm = BuildVm(worker);
+ await vm.OpenConPtySessionAsync("t1");
+ await vm.OpenMergeHelperConPtySessionAsync("L1", new[] { "t2" });
+
+ Assert.True(vm.ConPtySessions[0].ShowSubmitForReview);
+ Assert.False(vm.ConPtySessions[1].ShowSubmitForReview);
+ }
+
// A plain OpenConPtySessionAsync pane (not a list handler) never shows/allows the action --
// acceptance criterion 5 ("only at handler panes").
[Fact]