from pathlib import Path
import json,subprocess,hashlib,datetime,sys,time,os
W=Path('/mnt/data/work4110');R=W/'site';E=R/'доказательства/редакция-4.11.0';L=E/'журналы';L.mkdir(exist_ok=True)
commands=[
['node','инструменты/проверить-доказательный-контур-повтор-4-11.cjs',str(E/'ядро.json')],
['node','инструменты/испытать-переносы-4-5-повтор-4-11.cjs'],
['node','инструменты/испытать-контур-4-6-повтор-4-11.cjs'],
['node','инструменты/испытать-контур-4-7-повтор-4-11.cjs'],
['node','инструменты/испытать-ранний-разбор-4-11.cjs'],
['node','инструменты/испытать-протокол-4-11.cjs'],
['node','инструменты/испытать-поток-4-11.cjs'],
['node','инструменты/испытать-объяснение-4-11.cjs'],
['node','инструменты/испытать-причины-4-11.cjs'],
['node','инструменты/испытать-глубокую-цепочку-4-7-повтор-4-11.cjs'],
['node','инструменты/испытать-семантику-цепочки-4-11.cjs'],
['node','инструменты/испытать-границы-4-11.cjs'],
['node','инструменты/испытать-два-времени-4-11.cjs'],
['node','инструменты/испытать-индексы-4-11.cjs'],
['node','инструменты/испытать-завершение-4-11.cjs'],
['python','инструменты/сопоставить-валидаторы-повтор-4-11.py'],
['python','инструменты/испытать-приёмник-владельца-повтор-4-11.py'],
['python','инструменты/испытать-закрепление-DNS-повтор-4-11.py']]
start_index=int(os.environ.get("START","0"));rows=json.loads((E/"повтор-ядра.json").read_text())[:start_index] if start_index else []
for i,cmd in enumerate(commands):
 if i<start_index:continue
 start=datetime.datetime.now(datetime.timezone.utc).isoformat();t=time.monotonic();log=L/f'ядро-{i:02d}.log'
 with log.open('w') as f:
  try:cp=subprocess.run(cmd,cwd=R,stdout=f,stderr=subprocess.STDOUT,timeout=200);code=cp.returncode
  except subprocess.TimeoutExpired:code=124;f.write('\nТаймаут стенда, окончательный результат отсутствует.\n')
 dep=[R/cmd[1],*sorted((R/'ресурсы/сценарии').glob('*.js')),*sorted((R/'данные').glob('*4.11.0.json'))]
 row={'начало_UTC':start,'конец_UTC':datetime.datetime.now(datetime.timezone.utc).isoformat(),'команда':cmd,'cwd':str(R),'секунды':round(time.monotonic()-t,3),'код':code,'журнал':log.relative_to(R).as_posix(),'зависимости':[{'путь':p.relative_to(R).as_posix(),'SHA256':hashlib.sha256(p.read_bytes()).hexdigest()} for p in dep if p.exists()],'граница':'Локальный искусственный корпус текущего кода; не внешнее исполнение и не допуск всего инструмента.'};rows.append(row)
 (E/'повтор-ядра.json').write_text(json.dumps(rows,ensure_ascii=False,indent=2));print(i,code,cmd[1],flush=True)
print('COMPLETE',sum(r['код']==0 for r in rows),'/',len(rows))
