import subprocess
import os,sys,json,stat,hashlib,shutil,time
from pathlib import Path
root=Path('/home/reavus/projects/spt-core/spt-core')
tree=root/'.worktrees/gate-r3-25e60015'
target=tree/'target'
proof=root/'.spt/preserved/hertz-reclaim-AJM6OBJM'
proof.mkdir(exist_ok=True)
def digest(p):
 h=hashlib.sha256()
 with p.open('rb') as f:
  for b in iter(lambda:f.read(1048576),b''):h.update(b)
 return h.hexdigest()
def save(name,data):
 with (proof/name).open('x') as f:json.dump(data,f,indent=2)

census_program="import os,json,time\nfrom pathlib import Path\ntree=Path('/home/reavus/projects/spt-core/spt-core/.worktrees/gate-r3-25e60015')\ntarget=tree/'target'\ndef census():\n\n active=[];own=[];errors=[];control=False\n names={'cargo','cargo-nextest','rustc','rustdoc','clippy-driver','xtask','cmake','ninja'}\n for p in Path('/proc').iterdir():\n  if not p.name.isdigit():continue\n  try:\n   uid=p.stat().st_uid;comm=(p/'comm').read_text().strip()\n   if int(p.name)==os.getpid():control=True\n   exe='';cwd='';cmd=''\n   if True:\n    cmd=(p/'cmdline').read_bytes().replace(b'\\x00',b' ').decode(errors='replace')\n    try:exe=os.readlink(p/'exe')\n    except FileNotFoundError:pass\n    try:cwd=os.readlink(p/'cwd')\n    except FileNotFoundError:pass\n   row={'pid':int(p.name),'comm':comm,'exe':exe,'cwd':cwd,'cmd':cmd}\n   if comm in names or ('/target/' in exe and ('/debug/' in exe or '/release/' in exe)):active.append(row)\n   if str(target) in exe or cwd==str(tree) or cwd.startswith(str(tree)+'/') or (str(target) in cmd and int(p.name)!=os.getpid()):own.append(row)\n  except FileNotFoundError:continue\n  except PermissionError as e:\n   if True:errors.append(str(e))\n return {'active':active,'own':own,'errors':errors,'self_positive_control':control,'at':time.time()}\n\nprint(json.dumps(census()))\n"
def fresh_census():
 r=subprocess.run(['sudo','-n','python3','-'],input=census_program,text=True,capture_output=True,timeout=20)
 assert r.returncode==0,r.stderr
 s=json.loads(r.stdout)
 assert s['self_positive_control'] and not s['active'] and not s['own'] and not s['errors'],s
 return s
admission=json.loads((proof/'admission.json').read_text())
s=target.lstat();assert stat.S_ISDIR(s.st_mode) and not stat.S_ISLNK(s.st_mode)
assert [s.st_dev,s.st_ino]==admission['target_identity']
assert target.resolve()==target and not target.is_mount()
assert json.loads((target/'POOL-OWNER.json').read_text())==admission['owner']
assert not (Path('/proc')/str(admission['owner']['holder_pid'])).exists()
assert shutil.rmtree.avoids_symlink_attacks
source_entries=sorted(p.name for p in tree.iterdir() if p.name!='target')
main_pool=root/'target/POOL-OWNER.json'
main_pool_sha=digest(main_pool) if main_pool.exists() else None
source_git_sha=digest(tree/'.git')
pre=fresh_census();free_before=shutil.disk_usage(tree).free
save('reap-start.json',{'at':time.time(),'census':pre,'free_before':free_before,'target_identity':[s.st_dev,s.st_ino],'operation':'shutil.rmtree(target), symlink-attack-resistant implementation','source_git_sha256':source_git_sha,'main_pool_owner_sha256':main_pool_sha})
shutil.rmtree(target)
assert not os.path.lexists(target)
free_after=shutil.disk_usage(tree).free
assert tree.is_dir() and sorted(p.name for p in tree.iterdir())==source_entries
assert digest(tree/'.git')==source_git_sha
assert (digest(main_pool) if main_pool.exists() else None)==main_pool_sha
for row in admission['preserved_receipts']:
 p=Path(row['path']);assert p.stat().st_size==row['bytes'] and digest(p)==row['sha256'],str(p)
assert digest(Path(admission['receipt_manifest']))==admission['receipt_manifest_sha256']
post=fresh_census()
result={'authority':'AJM6OBJM','status':'REMOVED','target':str(target),'free_before':free_before,'free_after':free_after,'free_delta':free_after-free_before,'target_size_before':admission['size_before'],'target_size_after_bytes':0,'target_absent':True,'source_tree_retained':True,'source_entries_unchanged':True,'source_git_unchanged':True,'main_pool_owner_unchanged':True,'preserved_receipts_hash_verified':len(admission['preserved_receipts']),'holder_pid_absent_at_removal':True,'no_pool_release_command':'Holder PID absent; explicit retired-lane subtree deletion authorized; stale ownership record copied before deletion. No xtask invoked.','census_before':pre,'census_after':post,'at':time.time()}
save('reclaim-result.json',result);print(json.dumps(result))
