"""Check Euler's constant link for numberdb.org/T669.

Run with SageMath:
    sage -pip install numberdb
    sage -python repair-link-check.py
Place the authenticated Stieltjes_constants export in stieltjes.json beside
this script and the archived repair skill manifest in manifest.json.
This check evaluates Euler's constant as a 512-bit Arb ball and requires its
whole enclosure inside the decimal interval in the n=0 Stieltjes entry.
The identity follows exactly by setting n=0 in DLMF 25.2.5:
gamma_0 = lim_m (sum_{k=1}^m 1/k - log(m)), Euler's defining limit.
No T669 value is recomputed or changed by this navigation repair.
"""
import hashlib
import importlib.metadata
import json
from pathlib import Path
import sys
import numberdb.sage as numberdb
from sage.rings.rational_field import QQ
from sage.rings.real_arb import RealBallField
from sage.version import version
base=Path(__file__).resolve().parent
doc=json.loads((base/'stieltjes.json').read_text())
manifest=json.loads((base/'manifest.json').read_text())
assert manifest['status']=='ready'
assert len({item['sha256'] for item in manifest['versions']})==1
written=doc['Numbers']['0']
assert isinstance(written,str) and '.' in written and 'e' not in written
whole,fraction=written.split('.')
scale=10**len(fraction)
midpoint=QQ(int(whole+fraction))/scale
ulp=QQ(1)/scale
R=RealBallField(512)
gamma=R.euler_constant()
assert gamma.is_finite() and gamma.accuracy()>=500
assert gamma-R(midpoint-ulp)>0
assert R(midpoint+ulp)-gamma>0
assert not (gamma+R(QQ(1)/10**80)-R(midpoint-ulp)>0 and R(midpoint+ulp)-(gamma+R(QQ(1)/10**80))>0)
result={
    'table':'T669','checked_target':'Stieltjes_constants#0',
    'source':'https://dlmf.nist.gov/25.2#E5',
    'identity_argument':'Setting n=0 gives the harmonic-sum minus logarithm definition of Euler\u2019s constant.',
    'working_bits':512,'relative_accuracy_bits':int(gamma.accuracy()),
    'target_decimal':written,'ball':str(gamma),
    'entire_enclosure_inside_target_interval':True,'perturbation_1e_minus_80_rejected':True,
    'new_or_changed_T669_values':0,'T669_values_recomputed':0,
    'skill_manifest':'agents/runs/20261102T051632Z-repair-skills/manifest.json',
    'skill_sha256':{item['source']:item['sha256'] for item in manifest['versions']},
    'sage_version':version,'python_version':sys.version.split()[0],
    'numberdb_version':importlib.metadata.version('numberdb'),
    'script_sha256':hashlib.sha256(Path(__file__).read_bytes()).hexdigest(),
}
print(json.dumps(result,indent=2))
