feat(data): split list-handler prompt into triage/wait/merge roles

Adds HandlerTriageAlias/HandlerWaitAlias/HandlerMergeAlias to ModelRegistry and
replaces PromptKind.MergeHelperExecute with MergeHelperWait (phase 3 only) and
MergeHelperMerge (phases 4-5), so the list handler can run as three
cost-scoped sessions instead of two. Triage's Phase 2 now checks/sets a wide
verify command via get_list_config/set_list_config once per run. Merge now
merges before reruns, delegates diff review to a sonnet subagent, rejects
0-file diffs, tracks the merged-but-not-Done verify-gate outcome, and caps
reruns at one per task via handoff_list_handler's new nextPhase parameter.

InteractiveLaunchSpecService.cs still references the removed
PromptKind.MergeHelperExecute and fails to build -- wiring the Worker/UI side
onto the new roles is a follow-up task.
This commit is contained in:
mika kuns
2026-08-11 08:52:28 +02:00
parent 11103d4d3e
commit d3b91b5214
4 changed files with 185 additions and 71 deletions
@@ -57,4 +57,14 @@ public class ModelRegistryTests
{
Assert.Null(ModelRegistry.TryNormalizeAlias(input));
}
[Fact]
public void List_handler_role_aliases_are_valid_and_split_cost_by_role()
{
// Triage and Merge get the wide-context, expensive role; Wait just queues and blocks,
// so it stays on the cheaper model.
Assert.Equal("opus", ModelRegistry.NormalizeAlias(ModelRegistry.HandlerTriageAlias));
Assert.Equal("sonnet", ModelRegistry.NormalizeAlias(ModelRegistry.HandlerWaitAlias));
Assert.Equal("opus", ModelRegistry.NormalizeAlias(ModelRegistry.HandlerMergeAlias));
}
}