Grant requests against a fixed permit pool and turn the remaining capacity into an admit, hold, or shed remediation action.

remaining capacity A fixed permit pool is modeled with a scalar counter so the remaining capacity stays deterministic and free of object identity, and it is the only driver of the remediation action.

Semaphore Capacity Remediation Report

requests
semaphore_capacity_remediation_report.py
Replay: real traced execution (multi-file project)
capacity = 3
requests = 1
granted = 0

for _ in range(requests):
    if granted < capacity:
        granted += 1

available = capacity - granted
action = "admit" if available >= 2 else "hold" if available == 1 else "shed"

print("requests=" + str(requests) + " granted=" + str(granted) + " available=" + str(available) + " action=" + action)
capacity = 3
requests = 2
granted = 0

for _ in range(requests):
    if granted < capacity:
        granted += 1

available = capacity - granted
action = "admit" if available >= 2 else "hold" if available == 1 else "shed"

print("requests=" + str(requests) + " granted=" + str(granted) + " available=" + str(available) + " action=" + action)
capacity = 3
requests = 4
granted = 0

for _ in range(requests):
    if granted < capacity:
        granted += 1

available = capacity - granted
action = "admit" if available >= 2 else "hold" if available == 1 else "shed"

print("requests=" + str(requests) + " granted=" + str(granted) + " available=" + str(available) + " action=" + action)
  1. capacity ← 3, requests ← 1, granted ← 0

    1capacity→ 3 = 32requests→ 1 = 1  #@requests=2, 43granted→ 0 = 0
  2. for _ in range(requests):

    5for _0 in range(requests1):6    if granted < capacity:7        granted += 1
  3. granted ← 1

    5for _ in range(requests):6    if granted0 < capacity3:7        granted→ 1 += 1
  4. available ← 2, action ← admit

    9available→ 2 = capacity3 - granted110action→ admit = "admit" if available2 >= 2 else "hold" if available == 1 else "shed"1112print("requests=" + str(requests1) + " granted=" + str(granted1) + " available=" + str(available2) + " action=" + actionadmit)
    outputrequests=1 granted=1 available=2 action=admit
  1. capacity ← 3, requests ← 2, granted ← 0

    1capacity→ 3 = 32requests→ 2 = 23granted→ 0 = 0
  2. for _ in range(requests):

    pass 1 of 2
    5for _0 in range(requests2):6    if granted < capacity:7        granted += 1
  3. granted ← 1

    pass 1 of 2
    5for _ in range(requests):6    if granted0 < capacity3:7        granted→ 1 += 1
  4. for _ in range(requests):

    pass 2 of 2
    5for _1 in range(requests2):6    if granted < capacity:7        granted += 1
  5. granted ← 2

    pass 2 of 2
    5for _ in range(requests):6    if granted1 < capacity3:7        granted→ 2 += 1
  6. available ← 1, action ← hold

    9available→ 1 = capacity3 - granted210action→ hold = "admit" if available1 >= 2 else "hold" if available == 1 else "shed"1112print("requests=" + str(requests2) + " granted=" + str(granted2) + " available=" + str(available1) + " action=" + actionhold)
    outputrequests=2 granted=2 available=1 action=hold
  1. capacity ← 3, requests ← 4, granted ← 0

    1capacity→ 3 = 32requests→ 4 = 43granted→ 0 = 0
  2. for _ in range(requests):

    pass 1 of 4
    5for _0 in range(requests4):6    if granted < capacity:7        granted += 1
    All 4 passes — pass 1 is the card above
    pass_
    10
    21
    32
    43
  3. granted ← 1

    pass 1 of 3
    5for _ in range(requests):6    if granted0 < capacity3:7        granted→ 1 += 1
    All 3 passes — pass 1 is the card above
    passgranted
    10 1
    21 2
    32 3
  4. available ← 0, action ← shed

    9available→ 0 = capacity3 - granted310action→ shed = "admit" if available0 >= 2 else "hold" if available == 1 else "shed"1112print("requests=" + str(requests4) + " granted=" + str(granted3) + " available=" + str(available0) + " action=" + actionshed)
    outputrequests=4 granted=3 available=0 action=shed