package exec import ( "errors" "strings" "testing" "time" ) func TestAssessStepFailureBudgetExceededIsPermanent(t *testing.T) { ass := AssessStepFailure(StepFailureSignals{ Err: errors.New("budget_exceeded: tool calls 12 > max 10"), }) if ass.Class != FailurePermanent { t.Fatalf("budget exhaustion must classify permanent (no auto retry), got %s", ass.Class) } if !strings.Contains(ass.Reason, "permanent") { t.Fatalf("want permanent reason, got %s", ass.Reason) } } func TestAssessStepFailureDeadlinePastIsPermanent(t *testing.T) { ass := AssessStepFailure(StepFailureSignals{ Result: &Result{ErrorReason: "budget_exceeded: deadline 2026-10-01T00:00:00Z passed"}, }) if ass.Class != FailurePermanent { t.Fatalf("deadline exhaustion must classify permanent, got %s", ass.Class) } } func TestBudgetZeroValueUnlimited(t *testing.T) { var b Budget if b.MaxPromptTokens != 0 || b.MaxCompletionTokens != 0 || b.MaxToolCalls != 0 || !b.Deadline.IsZero() { t.Fatal("zero budget must express unlimited") } _ = time.Now }