#!/usr/bin/env node
'use strict';
const fs=require('node:fs'),path=require('node:path'),A=require('node:assert/strict'),os=require('node:os'),{Worker,MessageChannel}=require('node:worker_threads');
const R=path.resolve(__dirname,'..'),E=path.join(R,'доказательства/редакция-4.10.0'),K=require(path.join(R,'ресурсы/сценарии/доказательный-контур.js')),Executor=require(path.join(R,'ресурсы/сценарии/исполнитель-контура.js')),read=n=>JSON.parse(fs.readFileSync(path.join(R,n))),mode=process.argv[2]||'документы',samples=[],trace=[];
K.configureSchemas(Object.fromEntries(Object.entries(read('данные/профиль-схем-4.10.0.json').файлы).map(([k,n])=>[k,read(n.slice(1))])));
const sample=stage=>samples.push({этап:stage,...process.memoryUsage(),maxRSS_КиБ:process.resourceUsage().maxRSS});
const factory=()=>{const {port1,port2}=new MessageChannel();const w=new Worker(`const{workerData}=require('node:worker_threads');setInterval(()=>workerData.port.postMessage(process.memoryUsage()),20).unref();require(workerData.file);`,{eval:true,workerData:{file:path.join(R,'ресурсы/сценарии/поток-доказательного-контура.js'),port:port2},transferList:[port2]});port1.on('message',m=>trace.push(m));w.once('exit',()=>port1.close());return w;};
(async()=>{
 sample('начало');const original=read('доказательства/редакция-4.10.0/искусственное-дело-события-полнота.json'),previous=await K.importCaseBytes(Buffer.from(JSON.stringify(original)),'ИС-прежнее-дело.json'),fingerprint=await K.hashCanonical(previous);
 let c=structuredClone(previous);delete c.ша256;for(const f of ['журнал_молчания','срез_исправления','итоги_исправлений','остатки_ответов'])delete c[f];c.идентификатор='ИС-ГРАНИЦА-'+mode;c.документы=[];c.приложения=[];c.хронология=[];c.исправления=[];c.события_исправления=[];c.переносы=[];c.точное_время_проверки='2026-09-05T23:00:00.000Z';
 const doc=i=>({...structuredClone(previous.документы[0]),идентификатор:'ИС-ДОК-'+i,название:'Искусственный документ '+i,вид:'обращение',вопросы:[],ответы_на_вопросы:[],связанные_документы:[],приложения:[],срезы:[],текст:'ИС: не реальное обращение.'});
 const dims={документы:0,вопросы:0,события:0,получатели:0,конфликты:0,единицы_строк:0};let command='case-export',input=c;
 if(mode==='документы'||mode==='вопросы'||mode==='совместно'){
   for(let i=0;i<100;i++){const d=doc(i);if(mode==='вопросы'||mode==='совместно'){const count=40+(i<96?1:0);d.вопросы=Array.from({length:count},(_,j)=>({код:'ВОПРОС-'+i+'-'+j,текст:'Искусственный вопрос '+j}));dims.вопросы+=count;}c.документы.push(d);}dims.документы=100;
 }else if(mode==='события'||mode==='состав'){
   c.документы=[doc(0)];c.исправления=structuredClone(previous.исправления);const template=previous.события_исправления.find(e=>e.действие==='исправление источника'),base=Date.parse('2026-09-03T00:00:00.000Z');let prev=null;
   if(mode==='события')for(let i=0;i<512;i++){const e=await K.seal({...template,идентификатор:'ИС-ГРАНИЦА-СОБ-'+i,документ:c.документы[0].идентификатор,момент_события:new Date(base+i).toISOString(),внесено:new Date(base+i).toISOString(),предыдущий_ша256:prev});c.события_исправления.push(e);prev=e.ша256;}else{
    const names=Array.from({length:64},(_,i)=>'ИС-Получатель-'+i);c.исправления[0].получатели=names.map(название=>({название,уведомление:{состояние:'не проверено',доказательство:''},исправление:{состояние:'не проверено',доказательство:''}}));c.события_исправления=[await K.seal({...template,идентификатор:'ИС-ГРАНИЦА-СОСТАВ',документ:c.документы[0].идентификатор,действие:'изменение состава исправления',цель:'состав',предыдущий_ша256:null,момент_события:new Date(base).toISOString(),внесено:new Date(base).toISOString(),состав:{получатели:names,области_восстановления:['доступ','положение','видимость','репутация'],все_получатели_перечислены:true,основание_отсутствия_получателей:'',основание:'Искусственная граница состава'}})];dims.получатели=64;
   }dims.документы=1;dims.события=c.события_исправления.length;
 }else if(mode==='конфликты'){command='canonical';input={конфликты:Array.from({length:2048},(_,i)=>({идентификатор:'ИС-КОНФЛИКТ-'+i,основание:'Искусственный элемент ограничительного профиля, не действительный конфликт серии'}))};dims.конфликты=2048;
 }else if(mode==='строки'){command='canonical';input='X'.repeat(K.INTERACTIVE_PROFILE.stringUnits);dims.единицы_строк=input.length;
 }else throw Error('Неизвестная размерность');
 if(mode==='совместно'){
  c.исправления=structuredClone(previous.исправления);const template=previous.события_исправления.find(e=>e.действие==='исправление источника'),base=Date.parse('2026-09-03T00:00:00.000Z');let prev=null;
  const names=Array.from({length:64},(_,i)=>'ИС-Получатель-'+i);c.исправления[0].получатели=names.map(название=>({название,уведомление:{состояние:'не проверено',доказательство:''},исправление:{состояние:'не проверено',доказательство:''}}));
  for(let i=0;i<512;i++){const body={...template,идентификатор:'ИС-СОВМЕСТНО-'+i,документ:c.документы[0].идентификатор,момент_события:new Date(base+i).toISOString(),внесено:new Date(base+i).toISOString(),предыдущий_ша256:prev};if(!i){body.действие='изменение состава исправления';body.цель='состав';body.состав={получатели:names,области_восстановления:['доступ','положение','видимость','репутация'],все_получатели_перечислены:true,основание_отсутствия_получателей:'',основание:'Искусственный совместный максимум'};}const event=await K.seal(body);c.события_исправления.push(event);prev=event.ша256;}
  dims.получатели=64;dims.события=512;
 }
 const errors=command==='case-export'?await K.caseErrors(c):[];A.deepEqual(errors,[]);const checked=K.resourceCheck(input,{envelope:true}),inputBytes=K.canonicalBytes(input),inputHash=await K.hash(inputBytes);sample('сформирован и проверен вход');
 let accepted=false,error='',result;
 try{result=await new Executor({factory}).run(command,input,{envelope:true,onStage:sample});accepted=true;}catch(e){error=e.message;}
 sample('результат или явный отказ');A.equal(await K.hashCanonical(previous),fingerprint);
 let roundtrip=null;
 if(accepted&&command==='case-export'){const back=await new Executor({factory}).run('case-import',{file:new Blob([K.canonicalBytes(result)])},{envelope:true,onStage:sample});roundtrip=K.canonical(back.документы)===K.canonical(c.документы)&&K.canonical(back.события_исправления)===K.canonical(c.события_исправления);A(roundtrip);sample('повторный приём');}
 const report={редакция:K.RELEASE,дата:new Date().toISOString(),команда:'node инструменты/измерить-предметные-границы-4-10.cjs '+mode,размерность:mode,класс:'ИС — искусственный предметный корпус; конфликты и строки проверяют только транспортный профиль, не смысл требований',вход:dims,входные_байты:inputBytes.length,вход_SHA256:inputHash,профиль_входа:checked,предметная_схема:command==='case-export'?'проверена ядром':'не применялась: проверяется транспорт canonical',генератор_и_зерно:'Код сценария; индексы от нуля, фиксированная дата 2026-09-03; исходный шаблон указан в коде.',ядро_SHA256:await K.hash(fs.readFileSync(path.join(R,'ресурсы/сценарии/доказательный-контур.js'))),сценарий_SHA256:await K.hash(fs.readFileSync(__filename)),среда:{ОС:os.type(),ядро:os.release(),CPU:os.cpus()[0].model,Node:process.version,процесс:process.pid,архитектура:process.arch},принят:accepted,ошибка:error,повторный_приём:roundtrip,прежняя_работа_сохранена:true,RSS_МиБ:process.resourceUsage().maxRSS/1024,этапы:samples,изолят_потока_20мс:trace,предел:'Один отдельный процесс на размерность; режим совместно объединяет документы/вопросы/события/получателей, но не все возможные поля и строки. Не предел RSS и не браузер. Отказ расширенного выхода допускается защитным профилем, но показывает, что допустимый вход не гарантирует допустимого экспорта. Принудительной сборки мусора нет.'};fs.writeFileSync(path.join(E,'предметная-граница-'+mode+'.json'),JSON.stringify(report,null,2)+'\n');console.log(JSON.stringify({mode,accepted,error,RSS:report.RSS_МиБ}));
})().catch(e=>{console.error(e);process.exitCode=2;});
