from pathlib import Path
import subprocess,json,hashlib,datetime,sys,os
R=Path('/mnt/data/work4100/site');E=R/'доказательства/редакция-4.10.0';logs=E/'журналы';logs.mkdir(exist_ok=True)
label=sys.argv[1];cmd=sys.argv[2:];started=datetime.datetime.now(datetime.timezone.utc).isoformat()
fingerprints={str(p.relative_to(R)):hashlib.sha256(p.read_bytes()).hexdigest() for p in (R/'ресурсы/сценарии').glob('*.js')}
fingerprints.update({str(p.relative_to(R)):hashlib.sha256(p.read_bytes()).hexdigest() for p in (R/'данные').glob('*.json')})
for arg in cmd:
 q=Path(arg) if Path(arg).is_absolute() else R/arg
 if q.is_file() and q.is_relative_to(R):fingerprints[str(q.relative_to(R))]=hashlib.sha256(q.read_bytes()).hexdigest()
p=subprocess.run(cmd,cwd=R,capture_output=True,text=True,env={**os.environ,'PYTHONDONTWRITEBYTECODE':'1'})
log=logs/(label+'.log');log.write_text(p.stdout+'\nСТАНДАРТНЫЙ ПОТОК ОШИБОК\n'+p.stderr)
row={'метка':label,'команда':cmd,'начало_UTC':started,'конец_UTC':datetime.datetime.now(datetime.timezone.utc).isoformat(),'код_завершения':p.returncode,'испытанные_ресурсы':fingerprints,'журнал':str(log.relative_to(R)),'журнал_SHA256':hashlib.sha256(log.read_bytes()).hexdigest(),'граница':'Риск, вход и предел — в сценарии и предметном отчёте. Локальный процесс не является внешним свидетельством.'}
(E/(label+'-запуск.json')).write_text(json.dumps(row,ensure_ascii=False,indent=2)+'\n');print(label,p.returncode,p.stdout[-3000:],p.stderr[-1500:]);sys.exit(p.returncode)
