from pathlib import Path
R=Path('/mnt/data/work4100/site');p=R/'ресурсы/сценарии/доказательный-контур.js';s=p.read_text()
a=s.index('  const WORKER_PROTOCOL=')
extra='''  function explanationRequest(input){
    if(input&&Object.hasOwn(input,'дело')){
      if(Object.keys(input).sort().join(',')!=='дело,момент_знания,момент_среза'||!time(input.момент_среза)||!time(input.момент_знания)||Date.parse(input.момент_знания)<Date.parse(input.момент_среза))throw Error('Для отдельного объяснения нужны точные моменты среза и более позднего знания, без лишних полей.');
      return {case:input.дело,at:input.момент_среза,knowledge:input.момент_знания};
    }
    return {case:input,at:cutoff(input),knowledge:null};
  }
  function explainLateKnowledge(c,at,knownAt){
    if(!time(at)||!time(knownAt)||Date.parse(knownAt)<Date.parse(at))throw Error('Неверные границы отдельного объяснения знания.');
    const early=correctionExplanation(c,at),a=Date.parse(at),b=Date.parse(knownAt);
    const late=(c.события_исправления||[]).filter(e=>Date.parse(e.момент_события)<=a&&Date.parse(e.внесено)>a&&Date.parse(e.внесено)<=b).map(e=>{
      const raw=(c.документы||[]).find(d=>d.идентификатор===e.документ),doc=raw?documentAt(raw,knownAt):null;
      return {идентификатор:e.идентификатор,исправление:e.исправление,действие:e.действие,цель:e.цель,момент_события:e.момент_события,внесено:e.внесено,
        источник:e.источник,документ:e.документ,документ_в_позднем_контексте:doc?{идентификатор:doc.идентификатор,название:doc.название,состояние:doc.состояние}:null,
        проверяющий:e.проверяющий,отпечаток_события:e.ша256,причина:'Событие заявлено не позже раннего среза, но внесено позже. Оно не было доступно в раннем контексте знания.',
        предел:'Поздняя запись не доказывает, что событие действительно произошло. Ранний отчёт не пересчитан и не исправлен задним числом.'};
    });
    return {...early,позднее_внесение:{вид:'отдельно запрошенное объяснение двух времён',ранний_срез:at,момент_знания:knownAt,ранний_срез_не_изменён:true,события:late,
      граница:'Это добавочный поздний контекст, не новое содержимое раннего отчёта. Записи после момента знания не раскрыты. Перечень не удостоверяет внешние действия или неизменяемость истории.'}};
  }

'''
s=s[:a]+extra+s[a:];s=s.replace('const API = {canonicalMeasure,','const API = {explanationRequest,explainLateKnowledge,canonicalMeasure,');s=s.replace("const transport=resourceCheck(data,{envelope:true,representation:true}),p=INTERACTIVE_PROFILE;", "const transport=resourceCheck(data,{envelope:true,representation:true}),p=INTERACTIVE_PROFILE;\n    if(command==='case-explanation')data=explanationRequest(data).case;")
p.write_text(s)
p=R/'ресурсы/сценарии/поток-доказательного-контура.js';s=p.read_text();old="case 'case-explanation':{const errors=await K.caseErrors(data,options);if(errors.length)throw Error(errors.join('\\n'));value=await K.seal({...K.correctionExplanation(data),отпечаток_папки:await K.hashCanonical(K.payload(data))},options);break;}";new="case 'case-explanation':{const req=K.explanationRequest(data),errors=await K.caseErrors(req.case,options);if(errors.length)throw Error(errors.join('\\n'));const explanation=req.knowledge?K.explainLateKnowledge(req.case,req.at,req.knowledge):K.correctionExplanation(req.case,req.at);value=await K.seal({...explanation,отпечаток_папки:await K.hashCanonical(K.payload(req.case))},options);break;}";assert old in s;s=s.replace(old,new);p.write_text(s)
p=R/'ресурсы/сценарии/методика.js';s=p.read_text();old="const out=await задача('case-explanation',дело,{signal:отменаДела.signal});показатьПричины(out);";new="const known=$('#позднее-знание')?.value.trim(),at=дело.точное_время_проверки||дело.дата_проверки+'T23:59:59.999Z',input=known?{дело,момент_среза:at,момент_знания:known}:дело;const out=await задача('case-explanation',input,{signal:отменаДела.signal});показатьПричины(out);";assert old in s;s=s.replace(old,new)
needle=";host.append(summary);\n    for(const row of rows.slice(0,12))";replacement=";host.append(summary);\n    if(out.позднее_внесение){const p=document.createElement('p');p.textContent='Отдельный поздний контекст до '+out.позднее_внесение.момент_знания+': '+out.позднее_внесение.события.length+' поздних внесений. Ранние остатки выше не изменены. Полные опоры доступны в JSON.';host.append(p);}\n    for(const row of rows.slice(0,12))";assert needle in s;s=s.replace(needle,replacement);p.write_text(s)
p=R/'пакет-обжалования.html';s=p.read_text();needle='<button type="button" id="объяснить-остатки">';assert needle in s;s=s.replace(needle,'<label for="позднее-знание">Отдельный момент позднего знания (необязательно, UTC)</label><input id="позднее-знание" type="text" placeholder="2026-09-05T12:00:00.000Z" aria-describedby="предел-позднего-знания"><p id="предел-позднего-знания">Пустое поле сохраняет только ранний отчёт. Более поздний момент добавляет отдельный перечень поздних внесений, но не переписывает ранние остатки. Будущие относительно выбранного знания записи не раскрываются.</p><div id="объяснение-причины" aria-live="polite"></div>'+needle);p.write_text(s)
