"""Deterministic sequential controller; no model, runtime interruption or cost measurement."""
import hashlib,json
class Controller:
 def __init__(self):self.total=12;self.reserve=2;self.used=0;self.seen=set();self.state='exploring';self.reason=None;self.ledger=[]
 def observe(self,observation,now=0):
  if self.state!='exploring':return
  if now>=10000:self.stop('deadline');return
  if self.used>=self.total-self.reserve:self.stop('exploration_limit');return
  self.used+=1
  if observation.get('access')=='denied':self.ledger.append({'step':self.used,'newEvidence':False,'remaining':self.total-self.used});self.stop('blocked_access');return
  key=hashlib.sha256(json.dumps(observation,sort_keys=True).encode()).hexdigest()
  new=key not in self.seen;self.seen.add(key);self.ledger.append({'step':self.used,'fingerprint':key,'newEvidence':new,'remaining':self.total-self.used})
  if not new:self.stop('no_new_evidence')
  elif self.used>=self.total-self.reserve:self.stop('exploration_limit')
 def stop(self,why):self.state='stopped';self.reason=why
 def finalise(self,fail=False):
  assert self.state=='stopped'
  if self.reason=='deadline':return {'format':'stored checkpoint','reason':self.reason,'modelCall':False}
  self.used+=1
  if fail:return {'format':'stored checkpoint','reason':self.reason,'summary':'Finalisation failed; retain last verified evidence','used':self.used}
  return {'format':'handover','reason':self.reason,'used':self.used,'remaining':self.total-self.used}
obs={'fileHash':'H1','checkVersion':'C1','environment':'V1','error':'E7'}
a=Controller();a.observe(obs,1000);a.observe(obs,2000);assert a.reason=='no_new_evidence';handover=a.finalise()
b=Controller()
for i in range(10):b.observe({**obs,'fileHash':f'H{i}'})
assert b.reason=='exploration_limit';limit=b.finalise();assert limit['remaining']==1
c=Controller();c.observe({'access':'denied'});assert c.reason=='blocked_access';blocked=c.finalise(True)
d=Controller();d.observe(obs,10001);assert d.used==0;expired=d.finalise()
report={'repeat':{'ledger':a.ledger,'handover':handover},'limit':limit,'finalisationFailure':blocked,'expired':expired,'scope':'Illustrative12-step policy; fingerprints record supplied evidence, not actual truth or model reasoning'}
if __name__=='__main__':print(json.dumps(report,indent=2))
