#!/usr/bin/env python3 # Standalone synthetic fixture; no user files or external network. from datetime import datetime,timezone,timedelta from email.utils import parsedate_to_datetime,format_datetime class Service: def __init__(self):self.tasks=[];self.cache={};self.once=True def request(self,key=None,payload='invoice-17'): if key in self.cache: old,response=self.cache[key] if old!=payload:return {'status':409,'error':'same key with different payload'} return dict(response,cached=True) task={'id':f'TASK-{len(self.tasks)+1}','payload':payload};self.tasks.append(task);response={'status':201,'task':task} if key:self.cache[key]=(payload,response) if self.once:self.once=False;return {'status':503,'commitOccurred':True,'responseLost':True} return response naive=Service();naiveTrace=[naive.request(),naive.request()] keyed=Service();keyedTrace=[keyed.request('batch-17'),keyed.request('batch-17')];conflict=keyed.request('batch-17','different') assert len(naive.tasks)==2 and len(keyed.tasks)==1 and conflict['status']==409 now=datetime(2026,10,15,tzinfo=timezone.utc);dateHeader=format_datetime(now+timedelta(seconds=6),usegmt=True) responses=[{'status':429,'retryAfter':'2'},{'status':503,'retryAfter':dateHeader},{'status':201}] def replay_retry(responses,start,budgetSeconds=10): clock=start;trace=[] for attempt,response in enumerate(responses,1): trace.append({'attempt':attempt,'at':clock.isoformat(),**response}) if response['status']not in (429,503):break header=response['retryAfter'] delay=int(header)if header.isdigit()else max(0,(parsedate_to_datetime(header)-clock).total_seconds()) fallback=min(4,2**(attempt-1))+.25;wait=max(delay,fallback) if (clock-start).total_seconds()+wait>budgetSeconds: trace[-1]['stop']='budget exceeded';trace[-1]['requiredWaitSeconds']=wait;break trace[-1]['virtualWaitSeconds']=wait;clock+=timedelta(seconds=wait) return {'trace':trace,'elapsedVirtualSeconds':(clock-start).total_seconds(),'budgetSeconds':budgetSeconds,'actualSleepSeconds':0,'completed':bool(trace and trace[-1]['status']==201 and 'stop'not in trace[-1])} bounded=replay_retry(responses,now) assert bounded['completed'] and bounded['elapsedVirtualSeconds']==6 # Exercise the same controller, not an unrelated 120 > 10 comparison. longResponses=[{'status':429,'retryAfter':'120'},{'status':201}] excessive=replay_retry(longResponses,now) budgetBlocked=(len(excessive['trace'])==1 and excessive['trace'][0].get('stop')=='budget exceeded') assert budgetBlocked and not excessive['completed'] and excessive['elapsedVirtualSeconds']==0 assert excessive['trace'][0]['requiredWaitSeconds']==120 # The second response must not be consumed, and the server wait is never clamped. assert all(t['status']!=201 for t in excessive['trace']) result={'naive':{'trace':naiveTrace,'createdTasks':naive.tasks},'keyed':{'trace':keyedTrace,'createdTasks':keyed.tasks,'mismatchedPayload':conflict},'boundedRetry':{'responses':responses,**bounded},'excessiveRetryAfter':{'responses':longResponses,**excessive},'excessiveRetryAfterBlocked':budgetBlocked,'scope':'Local service state machine and virtual clock; no network, payments or real task creation. Idempotency depends on explicit server contract/storage and payload identity, not a header name alone.503 here intentionally represents a lost post-commit response.'} import sys,json from datetime import datetime,timezone result={'experiment':'retry-idempotency-local-fixture','executedAt':datetime.now(timezone.utc).isoformat(),'runtime':sys.version.split()[0],'synthetic':True,**result} print(json.dumps(result,ensure_ascii=False,indent=2))