Model a bounded retry loop.

retry-budget Retry loops need a limit. A small counter and status label show whether the script stopped because work succeeded or because the budget ran out.

Retry Budgets

failures
retry_budget.lua
Replay: real traced execution (multi-file project)
local failures = 2
local max_attempts = 3
local attempt = 0
local status = "retry"

while attempt < max_attempts and status == "retry" do
  attempt = attempt + 1
  if attempt > failures then
    status = "ok"
  end
end

if status ~= "ok" then
  status = "failed"
end

print("failures=" .. failures)
print("attempts=" .. attempt)
print("status=" .. status)
local failures = 0
local max_attempts = 3
local attempt = 0
local status = "retry"

while attempt < max_attempts and status == "retry" do
  attempt = attempt + 1
  if attempt > failures then
    status = "ok"
  end
end

if status ~= "ok" then
  status = "failed"
end

print("failures=" .. failures)
print("attempts=" .. attempt)
print("status=" .. status)
local failures = 3
local max_attempts = 3
local attempt = 0
local status = "retry"

while attempt < max_attempts and status == "retry" do
  attempt = attempt + 1
  if attempt > failures then
    status = "ok"
  end
end

if status ~= "ok" then
  status = "failed"
end

print("failures=" .. failures)
print("attempts=" .. attempt)
print("status=" .. status)
  1. failures ← 2, max_attempts ← 3, attempt ← 0, status ← retry

    1local failures→ 2 = 2 --@failures=0, 32local max_attempts→ 3 = 33local attempt→ 0 = 04local status→ retry = "retry"
  2. attempt ← 1

    pass 1 of 3
    6while attempt0 < max_attempts3 and statusretry == "retry" do7  attempt→ 1 = attempt + 18  if attempt > failures then
    All 3 passes — pass 1 is the card above
    passfailuresattemptstatus
    10 1retry
    21 2retry
    322 3ok
  3. status ← ok

    7attempt = attempt + 18if attempt3 > failures2 then9  status→ ok = "ok"10end
  4. print("failures=" .. failures)

    17print("failures=" .. failures2)18print("attempts=" .. attempt3)19print("status=" .. statusok)
    outputfailures=2
    attempts=3
    status=ok
  1. failures ← 0, max_attempts ← 3, attempt ← 0, status ← retry

    1local failures→ 0 = 02local max_attempts→ 3 = 33local attempt→ 0 = 04local status→ retry = "retry"
  2. attempt ← 1

    6while attempt0 < max_attempts3 and statusretry == "retry" do7  attempt→ 1 = attempt + 18  if attempt > failures then
  3. status ← ok

    7attempt = attempt + 18if attempt1 > failures0 then9  status→ ok = "ok"10end
  4. print("failures=" .. failures)

    17print("failures=" .. failures0)18print("attempts=" .. attempt1)19print("status=" .. statusok)
    outputfailures=0
    attempts=1
    status=ok
  1. failures ← 3, max_attempts ← 3, attempt ← 0, status ← retry

    1local failures→ 3 = 32local max_attempts→ 3 = 33local attempt→ 0 = 04local status→ retry = "retry"
  2. attempt ← 1

    pass 1 of 3
    6while attempt0 < max_attempts3 and statusretry == "retry" do7  attempt→ 1 = attempt + 18  if attempt > failures then
    All 3 passes — pass 1 is the card above
    passattemptstatus
    10 1retry
    21 2retry
    32 3retry failed
  3. status ← failed

    13if statusretry ~= "ok" then14  status→ failed = "failed"15end
  4. print("failures=" .. failures)

    17print("failures=" .. failures3)18print("attempts=" .. attempt3)19print("status=" .. statusfailed)
    outputfailures=3
    attempts=3
    status=failed