feat(orchestrator): soft occupancy threshold requests handoff early (S11 partial)
Coordinator.Soft (default 0.55, ORCHESTRA_OCCUPANCY_SOFT) makes rotate() and TurnDecision request a handoff advisory-only once occupancy crosses the soft threshold, well before Hard forces a release/rotation. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W1rkJ2hBMybnJctPbcy4tT
This commit is contained in:
@@ -218,6 +218,26 @@ func TestTurnDecision(t *testing.T) {
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("prepare_handoff at soft threshold, below hard, without a turn boundary", func(t *testing.T) {
|
||||
a := &handoffRequestingAdapter{fakeAdapter: fakeAdapter{occupancy: .6, boundary: false}}
|
||||
c, st, task := newCoordinator(&a.fakeAdapter)
|
||||
c.Adapters = adapters{a}
|
||||
decision, err := c.TurnDecision(context.Background(), task.ID)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if decision != orchestrator.TurnPrepareHandoff {
|
||||
t.Fatalf("decision=%q want %q", decision, orchestrator.TurnPrepareHandoff)
|
||||
}
|
||||
if a.requests == 0 {
|
||||
t.Fatal("RequestHandoff was never invoked at the soft threshold")
|
||||
}
|
||||
got, ok := st.Task(task.ID)
|
||||
if !ok || got.State != domain.StateLeased {
|
||||
t.Fatalf("task state=%v ok=%v, want still leased (soft threshold is advisory)", got.State, ok)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("prepare_handoff requests handoff without releasing", func(t *testing.T) {
|
||||
a := &handoffRequestingAdapter{fakeAdapter: fakeAdapter{occupancy: .95, boundary: true}}
|
||||
c, st, task := newCoordinator(&a.fakeAdapter)
|
||||
|
||||
Reference in New Issue
Block a user