"""Original 64-coordinate ownership ring, no real hash function or cluster."""
from bisect import bisect_left
from collections import Counter
import json

def validate(nodes):
 if type(nodes) is not list or not 1<=len(nodes)<=8 or any(type(r) is not tuple or len(r)!=2 or type(r[0]) is not str or not r[0] or type(r[1]) is not int or not 0<=r[1]<64 for r in nodes) or len({r[0] for r in nodes})!=len(nodes) or len({r[1] for r in nodes})!=len(nodes):raise ValueError('1..8 distinct IDs/coordinates0..63')

def owner(nodes,key):
 validate(nodes)
 if type(key) is not int or not 0<=key<64:raise ValueError('integer key coordinate0..63')
 ordered=sorted(nodes,key=lambda r:r[1]);i=bisect_left([p for n,p in ordered],key);return ordered[i%len(ordered)][0]

def oracle(nodes,key):return min(nodes,key=lambda r:(r[1]-key)%64)[0]

def mapping(nodes):
 out=[owner(nodes,k) for k in range(64)];assert out==[oracle(nodes,k) for k in range(64)];return out

def remove(nodes,ident):
 validate(nodes)
 if ident not in dict(nodes) or len(nodes)==1:raise ValueError('known removal and nonempty result required')
 return [r for r in nodes if r[0]!=ident]

def demo():
 nodes=[('A',8),('B',24),('C',48)];joined=nodes+[('D',36)];left=remove(nodes,'B');before=mapping(nodes);after=mapping(joined);leave=mapping(left)
 moved=[k for k in range(64) if before[k]!=after[k]];removed=[k for k in range(64) if before[k]!=leave[k]];assert moved==list(range(25,37)) and removed==list(range(9,25));assert dict(Counter(after))=={'A':24,'B':16,'C':12,'D':12}
 rotations=[]
 for shift in [1,13,63]:
  rotated=[(n,(p+shift)%64) for n,p in nodes]
  assert all(owner(rotated,(k+shift)%64)==before[k] for k in range(64));rotations.append({'shift':shift,'all64_owner_ids_preserved':True})
 rejected=[]
 for label,fn in [('empty',lambda:owner([],0)),('duplicate_position',lambda:owner([('A',1),('B',1)],0)),('duplicate_id',lambda:owner([('A',1),('A',2)],0)),('out_of_ring',lambda:owner(nodes,64)),('bool_coordinate',lambda:owner([('A',True)],0)),('unknown_remove',lambda:remove(nodes,'Z')),('last_remove',lambda:remove([('A',8)],'A'))]:
  try:fn()
  except ValueError:rejected.append(label)
  else:raise AssertionError('expected rejection')
 return {'ring_size':64,'boundary_policy':'first clockwise node with coordinate>=key; exact collision is explicitly local, unlike source strict larger wording','nodes':nodes,'all64_before':before,'after_join_D36':{'nodes':joined,'all64':after,'moved_keys':moved,'loads':dict(Counter(after))},'after_remove_B':{'nodes':left,'all64':leave,'moved_keys':removed,'loads':dict(Counter(leave))},'rotation_oracles':rotations,'invalid_cases_rejected':rejected,'scope':'fixed authored coordinates, no actual hashing/uniformity/virtual-nodes/replication/consensus/security/availability/benchmark or Opera deployment claim'}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=True,indent=2))
