"""Verify T694 and independently check every stored number's last-place claim.
Run with generate.py, roster.json, independent-roots.json and polynomials.json.
For a private draft, configure NUMBERDB_API_KEY; the campaign pipes its key.
"""
import os,sys,json,math
from fractions import Fraction
from pathlib import Path
if os.environ.get('NUMBERDB_KEY_FROM_STDIN')=='1':os.environ['NUMBERDB_API_KEY']=sys.stdin.read().strip()
import numberdb.sage as numberdb
from numberdb._generate import _stored_entries
from numberdb._compare import _claim,_as_fraction,_complex_parts,digits_of
from sage.rings.real_mpfr import RealField
from sage.rings.real_mpfi import RealIntervalField
from sage.rings.complex_interval_field import ComplexIntervalField
from sage.rings.rational_field import QQ
from generate import PeriodPolynomialZeros,ROSTER
BASE=Path(__file__).parent;R=RealField(750);RI=RealIntervalField(750);CI=ComplexIntervalField(750)
report=PeriodPolynomialZeros().verify(sample=None);print('VERIFY',report,flush=True);assert report.ok
stored=_stored_entries(numberdb.table('T694'));assert len(stored)==626
independent=json.loads((BASE/'independent-roots.json').read_text());polynomials=json.loads((BASE/'polynomials.json').read_text())
boxes={};maxulp=R(0);exactparts=0

def rational(text):
 q=Fraction(text);return QQ(q.numerator)/q.denominator

def part(text):
 q=_as_fraction(text)
 if q is not None:return RI(QQ(q.numerator)/q.denominator)
 c,e=_claim(text);return RI(rational(str(c))-rational(str(e)),rational(str(c))+rational(str(e)))
for item in independent:
 p=item['params'];key=','.join(str(p[n]) for n in ['N','k','i','j']);text=stored[key]
 assert digits_of(text)>=100
 re,im=_complex_parts(text) or (text,'0');z=[R(item['real']),R(item['imag'])];forced=item['forced'];known={}
 if forced in ['real+','real-']:known={0:Fraction(1 if forced=='real+' else -1),1:Fraction(0)}
 elif forced in ['imag+','imag-']:
  known={0:Fraction(0)}
  if math.isqrt(p['N'])**2==p['N']:known[1]=Fraction(1 if forced=='imag+' else -1,math.isqrt(p['N']))
 elif forced and forced.startswith('elliptic:'):known={0:Fraction(int(forced.split(':')[1]),2)}
 for axis,txt in enumerate([re,im]):
  c,e=_claim(txt)
  if axis in known:assert _as_fraction(txt)==known[axis];exactparts+=1
  else:
   assert e>0,(key,axis,txt)
   ulp=abs(z[axis]-R(str(c)))/R(str(e));assert ulp<=1,(key,axis,str(ulp));maxulp=max(maxulp,ulp)
 b=CI(part(re),part(im));assert 1 in p['N']*(b.real()**2+b.imag()**2)
 boxes.setdefault((p['N'],p['k'],p['i']),[]).append(b)

def overlaps(a,b):
 return a.real().lower()<=b.real().upper() and b.real().lower()<=a.real().upper() and a.imag().lower()<=b.imag().upper() and b.imag().lower()<=a.imag().upper()
for pp in polynomials:
 key=(pp['N'],pp['k'],pp['i']);roots=boxes[key];assert len(roots)==pp['k']-2
 for z in roots:
  assert any(overlaps(-z.conjugate(),q) for q in roots)
  assert any(overlaps(-1/(pp['N']*z),q) for q in roots)
 coeff=[CI(1)]
 for z in roots:
  n=[CI(0)]*(len(coeff)+1)
  for j,c in enumerate(coeff):n[j]-=z*c;n[j+1]+=c
  coeff=n
 raw=[CI(R(a),R(b)) for a,b in pp['coefficients']]
 for a,b in zip(coeff,raw):assert overlaps(a,b/raw[-1])
evidence={'table':'T694','generator_verify_ok':bool(report.ok),'stored_entries_checked':len(stored),'exact_components_preserved':exactparts,'max_difference_in_stored_ulps':str(maxulp),'stored_identities':'Every circle enclosure contains 1 for N*abs(rho)^2; reflection and reciprocal partners overlap; interval Vieta products overlap every normalized coefficient. Independent Mellin roots lie in every nonexact component interval. Exact components match their proved rational values.','skill_manifest':'agents/runs/20261109T165350Z-build-skills/manifest.json'}
print('POSTFILL '+json.dumps(evidence),flush=True)
