from pathlib import Path
import subprocess,json,sys,hashlib,datetime
R=Path('/mnt/data/work4100/site'); E=R/'доказательства/редакция-4.10.0'
names=['проверить-доказательный-контур-повтор-4-10.cjs','испытать-переносы-4-5-повтор-4-10.cjs','испытать-контур-4-6-повтор-4-10.cjs','испытать-контур-4-7-повтор-4-10.cjs','испытать-ранний-разбор-4-10.cjs','испытать-протокол-4-10.cjs','испытать-поток-4-10.cjs','испытать-объяснение-4-10.cjs','испытать-причины-4-10.cjs','испытать-глубокую-цепочку-4-7-повтор-4-10.cjs','испытать-семантику-цепочки-4-10.cjs','испытать-границы-4-10.cjs','испытать-два-времени-4-10.cjs','испытать-службу-4-10.cjs','испытать-приёмник-владельца-повтор-4-10.py','испытать-закрепление-DNS-повтор-4-10.py','сопоставить-валидаторы-повтор-4-10.py']
rows=[]
for i,n in enumerate(names):
 path=R/'инструменты'/n
 if n=='проверить-доказательный-контур-повтор-4-10.cjs':
  # Existing core corpus uses explicit paths, preserving its exact inputs/definition.
  args=['node',str(path),str(E/"ядро.json")]
 else: args=['python' if n.endswith('.py') else 'node',str(path)]
 if not path.exists():
  print('MISSING',n,flush=True);rows.append({'имя':n,'код':127});continue
 p=subprocess.run(['python','/mnt/data/work4100/run_command.py','окончательный-%02d'%i]+args,cwd=R,capture_output=True,text=True)
 rows.append({'имя':n,'код':p.returncode,'сценарий_SHA256':hashlib.sha256(path.read_bytes()).hexdigest()});print(n,p.returncode,p.stdout[-1000:],p.stderr[-300:],flush=True)
(E/'окончательный-повтор.json').write_text(json.dumps({'UTC':datetime.datetime.now(datetime.timezone.utc).isoformat(),'ядро_SHA256':hashlib.sha256((R/'ресурсы/сценарии/доказательный-контур.js').read_bytes()).hexdigest(),'запуски':rows,'предел':'Локальные корпуса, не внешний допуск. Подробности каждого запуска и первые провалы сохранены.'},ensure_ascii=False,indent=2)+'\n')
