fix: disable agent dry-run without executor
CI / test (push) Successful in 26s
CI / test (pull_request) Successful in 24s

This commit is contained in:
m
2026-08-22 16:43:32 +03:00
parent 7030a51b69
commit dd7fd2cd68
5 changed files with 82 additions and 5 deletions
+8
View File
@@ -15,6 +15,14 @@ type WorkerCycleResult struct {
Idle bool
}
// RecoverOnlyWorkerCycle keeps durable recovery alive while the real executor
// capability is absent. It intentionally does not claim a dispatch: a missing
// executor must never be represented as successful work.
func RecoverOnlyWorkerCycle(ctx context.Context, store ports.WorkerStore, now time.Time, staleAfter time.Duration) (WorkerCycleResult, error) {
recovered, err := store.RecoverStaleClaims(ctx, now.UnixMilli(), staleAfter.Milliseconds())
return WorkerCycleResult{RecoveredClaims: recovered, Idle: err == nil}, err
}
func ExecuteWorkerCycle(ctx context.Context, store ports.WorkerStore, workerID string, token work.AgentFencingToken, now time.Time, staleAfter, leaseTTL time.Duration) (WorkerCycleResult, error) {
recovered, err := store.RecoverStaleClaims(ctx, now.UnixMilli(), staleAfter.Milliseconds())
if err != nil {
+46
View File
@@ -0,0 +1,46 @@
package application
import (
"context"
"testing"
"time"
"git.cin.su/m/Assistant/contracts/work"
)
type recoveryOnlyStore struct {
recovered int64
claimed bool
}
func (s *recoveryOnlyStore) RecoverStaleClaims(context.Context, int64, int64) (int64, error) {
return s.recovered, nil
}
func (s *recoveryOnlyStore) ClaimNextDispatch(context.Context, string, int64) (work.AgentDispatchQueueItem, error) {
s.claimed = true
return work.AgentDispatchQueueItem{}, nil
}
func (s *recoveryOnlyStore) LoadDispatchIntent(context.Context, string) (work.AgentDispatchIntent, error) {
return work.AgentDispatchIntent{}, nil
}
func (s *recoveryOnlyStore) CompleteDispatch(context.Context, string, string, work.AgentDispatchQueueState, int64) error {
return nil
}
func (s *recoveryOnlyStore) SaveDispatchIntent(context.Context, work.AgentDispatchIntent) error {
return nil
}
func (s *recoveryOnlyStore) SaveAgentLease(context.Context, work.AgentLease) error { return nil }
func (s *recoveryOnlyStore) AcceptAgentCallback(context.Context, work.AgentCallback) error {
return nil
}
func TestRecoverOnlyWorkerCycleNeverClaimsDispatch(t *testing.T) {
store := &recoveryOnlyStore{recovered: 2}
result, err := RecoverOnlyWorkerCycle(context.Background(), store, time.UnixMilli(1_700_000_000_000), time.Minute)
if err != nil {
t.Fatal(err)
}
if result.RecoveredClaims != 2 || !result.Idle || store.claimed {
t.Fatalf("unexpected recovery-only result: %+v claimed=%t", result, store.claimed)
}
}