const escapeHtml = (value) => String(value).replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"').replaceAll("'", '''); const p = (text) => `
${text}
`; const h2 = (text) => `${escapeHtml(text)}`;
const ol = (items) => `| ${cell} | `).join('')}
|---|
| ${cell} | `).join('')}
synthetic-plan-hand-off; productionEffect всегда not-attempted.'),
h2('Не сохраняйте фразу отдельно от рамки'),
p('Полезно думать о совете не как о цитате, а как о карточке из нескольких независимых частей. Первая часть — claim: вопрос о том, что именно когда-нибудь потребуется сформулировать. Вторая — condition: вопрос о версии и применимости. Третья — evidence: вопрос о допустимой привязке к immutable version или dated snapshot. Пока значения не собраны в отдельном авторизованном scope, все три остаются not-collected. Такой дизайн кажется строгим, зато он не даёт прошлому ярлыку стать сегодняшней командой.'),
p('Слова «сохранить совет» иногда ошибочно понимают как сохранить всю формулировку. Это опасный вид архива: строка может выглядеть точной, но не указывать ни объект, ни исключение, ни границу. В плановом материале даже правдоподобную строку нельзя сочинять: она станет фиктивной старой цитатой. Вместо неё фиксируется идентификатор вопроса future-advice-claim-question-v1. Идентификатор не рассказывает историю и не закрывает спор; он позволяет различить поле claim от condition и не подставить одно вместо другого.'),
table('Карточка сохранения будущего вопроса о совете', ['Поле', 'Фиксированное значение P117', 'Что это разрешает', 'Какой вывод закрыт'], [['Claim', 'future-advice-claim-question-v1 + not-collected', 'Назвать предмет будущего разбора', 'Существовал старый тезис или его точная формулировка'], ['Condition', 'future-advice-condition-question-v1', 'Отдельно потребовать версию и применимость', 'Совет подходит конкретной версии или среде'], ['Evidence', 'immutable-version-or-dated-snapshot', 'Запросить устойчивую ссылку', 'Документ уже найден или не менялся'], ['Repro', 'not-run / not-injected', 'Оставить место для будущей проверки', 'Поведение воспроизведено'], ['Correction', 'not-declared', 'Не терять вопрос о возможной правке', 'Что-либо исправлено или стало лучше']]),
h2('Допущение — часть смысла, а не примечание'),
p('У любого практического совета есть область, за пределами которой он может стать вредным. Это не делает совет плохим. Условие может зависеть от версии интерфейса, режима запуска, формата входа, политики доступа или внешнего контракта. Но P117 не называет ни одну такую реальную версию: назвать её означало бы притвориться, что старый объект уже известен. Поле condition хранит только вопрос и запрет на значение. Будущий исследователь должен будет собрать версию и применимость как evidence, а не вытащить их из уверенной интонации текста.'),
p('Отдельный риск — подменить условие рекомендацией. Фраза «проверяйте документацию» не говорит, какую именно документацию можно считать основанием. Здесь boundary жёстче: current page сама по себе не годится, если она может измениться. Нужна версия, неизменяемый commit или датированный снимок. Это не требование собрать ссылку прямо сейчас. Это правило, по которому будущий scope будет отличать источник вопроса от изменяемого объяснения. Пока pin не назван, evaluator возвращает stop и не подставляет разумный default.'),
figure('/assets/editorial/2027/mistakes-revisions-2027-advice-timeline.svg', 'Временная шкала P117: editor date 2026-07-31, будущая plan date 2027-11 и source cutoff 2026-07-31 окружают три вопроса claim, condition и evidence; между ними нет заявленного прошлого совета или результата.', 'Схема показывает temporal boundary и порядок вопросов для будущего разбора. Она не является снимком статьи, журналом изменений, документацией или подтверждением того, что совет когда-либо существовал.'),
h2('Исполнимый пример оставляет содержание неизвестным'),
p('Ниже запущенный фрагмент работает исключительно с named fixed in-memory literal. Он не принимает URL, текст статьи, переменные окружения, файл, часы, сеть, Git, журнал, тестовый стенд или пользовательский ввод. Возвращаемый status описывает только форму плана. В частности, печать not-collected не означает, что материал потерян; она означает, что P117 не получил права назвать его собранным. Это небольшая, но важная защита от случайного превращения редакционного черновика в источник истории.'),
code("import { inspectAdvicePreservationLiteral } from './upgrade-2027-11.mjs';\n\nconst fixedAdviceQuestion = inspectAdvicePreservationLiteral();\nconsole.log({\n literal: fixedAdviceQuestion.literal,\n claim: fixedAdviceQuestion.claim,\n condition: fixedAdviceQuestion.condition,\n result: fixedAdviceQuestion.status,\n effect: fixedAdviceQuestion.productionEffect,\n});"),
p('Пример намеренно не печатает якобы старую формулировку. Если добавить её в literal, она станет synthetic текстом, но читатель легко примет её за найденный архив. Тот же запрет действует для номера версии, времени публикации, имени автора и причины изменения: реалистичность не превращает выдуманную деталь в evidence. Безопасный учебный результат — лишь hand-off с названиями вопросов, которые другой scope сможет принять, отклонить или уточнить.'),
h2('Как удержать границу при подготовке'),
p('Первый практический вопрос звучит не «надо ли переписать совет?», а «какое утверждение требуется сохранить вместе с условиями?». Это меняет стоимость обсуждения. Команда не должна согласовать литературную трактовку, пока не знает минимальный доказательный пакет. Сначала разделяются claim, condition и evidence; затем решается, достаточно ли будущему читателю одной версии документа или нужна отдельная проверка поведения. Такая последовательность не обещает, что проверка будет выполнена. Она только предотвращает необратимый вывод до появления входных данных.'),
ol(['Поставить на карточке все три фиксированные даты: editorDate: 2026-07-31, planDate: 2027-11 и sourceCutoff: 2026-07-31.', 'Назвать claim идентификатором вопроса, не создавать цитату, заголовок старого материала или вывод о его истинности.', 'Назвать condition отдельным идентификатором и оставить version/applicability как not-collected; не переносить условие из памяти.', 'Разрешить evidence только как future reference с immutable version или dated snapshot; mutable current page вернуть на stop.', 'Сохранить repro как not-run и not-injected; не писать, что тест или ручная проверка уже дали результат.', 'Передать только synthetic plan hand-off в отдельный authorisation scope, где будут заново определены доступ, метод и ответственный вопрос.']),
h2('Контрпример: память не становится provenance'),
p('Иногда самый быстрый путь — сказать: «все знают, почему это правило появилось». Именно здесь контекст теряется окончательно. Коллективная память может подсказать направление поиска, но не заменяет pinned evidence и не позволяет утверждать историю. Она особенно ненадёжна, когда один и тот же короткий совет кочует между версиями или командами. В P117 память не запрещена как будущий вход, но ей не выдана роль доказательства. До отдельной оценки она остаётся неназванным источником и должна закрывать принятие, а не открывать его.'),
p('Другой контрпример — заменить условие широкой оговоркой «зависит от контекста». Такая фраза выглядит осторожно, но ничего не защищает: читатель не знает, какой контекст нужно зафиксировать и как обнаружить несовместимость. Named condition question строже и полезнее. Она требует будущую версию и применимость, однако не делает вид, что они уже известны. В результате карточка сохраняет неопределённость в явном поле, а не прячет её в конце абзаца.'),
h2('Минимальная карточка дешевле последующего пересказа'),
p('У такой карточки есть ещё одно практическое свойство: она не заставляет будущего читателя доверять редактору. Достаточно увидеть, что claim, condition и evidence названы раздельно, а значения не подменены. Если одна часть окажется нерелевантной, новый scope сможет удалить или заменить именно её, не переписывая вокруг вымышленную историю. Это уменьшает blast radius редакторского решения: меняется вопросная карточка, а не вывод о людях, системах или уже опубликованных результатах.'),
p('Не надо добавлять в карточку поле «уверенность». До появления evidence оно будет измерять только риторику автора. Не надо добавлять и поле «приоритет»: без предмета и владельца оно станет скрытой очередью. Нужны лишь идентификаторы будущих вопросов и стоп-границы. Такая аскетичность не делает будущий разбор беднее; она оставляет ему возможность выбрать метод по реальному объекту, а не по предзаполненной оценке.'),
h2('Ограничения и следующий шаг'),
p('Эта модель не проверяет архив, репозиторий, release notes, документацию, конфигурацию, реальный совет, авторство, ссылку, тест или production. Она также не решает, нужна ли коррекция и кому её выполнять. Deep freeze защищает только учебный объект в памяти, а не информацию за его пределами. Официальные источники ниже задают язык происхождения, конфигурационной основы и дат, но не являются ревизией чьего-либо текста. Они не превращают synthetic names в historical facts.'),
p('Следующий шаг не «обновить старую статью», потому что здесь нет такой статьи. Нужен отдельный scope с явно разрешённым объектом исследования. В нём можно будет выбрать один claim question, определить допустимую immutable привязку, собрать condition и сформулировать критерий опровержения. До этого P117 заканчивается ровно там, где должен: записанной формой вопроса и synthetic-plan-hand-off, без декларации коррекции или эффекта.'),
], commonRefs);
const mechanism = revision({ slug: 'editorial-2027-11-mechanism-mistakes-revisions', title: 'Пересмотр старых советов: версия, условие и граница опровержения', categories: ['Архитектура', 'Надёжность'], cover: '/assets/editorial/2027/mistakes-revisions-2027-condition-correction-matrix.svg', excerpt: 'План P117 на ноябрь 2027: как отделить противоречие и будущий repro от версии и условия, чтобы непроверенный пересмотр не стал вердиктом.', readingMinutes: 25 }, [
p('Пересмотр старого совета ломается не только из-за отсутствующей цитаты. Дорогая ошибка появляется, когда несовпадение версии или условия сразу называют опровержением. Один человек видит новый вариант интерфейса, другой помнит другую предпосылку, и разговор быстро превращается в «совет больше не работает». Цена — ложная отмена полезного правила либо, наоборот, сохранение правила там, где его предпосылка уже не названа. Оба исхода заставляют команду делать лишний круг диагностики.'),
p('P117 не содержит старого совета, версии, документа, противоречащего наблюдения, окружения, воспроизведения, тестового лога или результата повтора. Это будущий сценарий на planDate: 2027-11 при editor date и source cutoff 2026-07-31. Поэтому слово «опровергнут» здесь не может стать итогом. Положительный evaluator output один: synthetic-plan-hand-off с productionEffect: not-attempted. Любая попытка добавить подтверждённый repro, текущую mutable страницу или заявленную коррекцию должна закрываться.'),
h2('Версия не равна противоречию'),
p('Версия описывает, к какому состоянию предмета относится будущий вопрос. Противоречие описывает другой вопрос: какой факт мог бы сделать claim несостоятельным при сопоставимых условиях. Эти сущности нельзя склеивать. Если в документе найдена новая версия, это ещё не говорит, что прежнее утверждение неверно: возможно, изменился предмет, область применимости или словарь. И наоборот, даже зафиксированная старая версия не гарантирует, что совет работал в каждом режиме. Для честной ревизии нужны два разных поля и два разных основания.'),
p('В literal P117 поле condition имеет named id, но version и applicability остаются not-collected. Поле contradiction тоже названо, однако его state — not-collected. Это не бедность модели, а барьер против преждевременной логики. Пока сторона сравнения не определена, нельзя объявить противоречие и нельзя выбирать «исправление». Хорошая модель оставляет неизвестное неизвестным, а не заполняет его наиболее правдоподобным текстом.'),
table('Матрица механизма пересмотра', ['Слой', 'Вопрос будущего scope', 'Допустимое состояние P117', 'Недопустимая подмена'], [['Claim', 'Что потребуется проверить?', 'question-only', 'Придуманная старая цитата'], ['Version / condition', 'К какой версии и области применим вопрос?', 'not-collected', 'Версия из памяти или current page'], ['Contradiction', 'Что именно могло бы опровергнуть claim?', 'not-collected', 'Новая формулировка как готовый вердикт'], ['Repro boundary', 'Какое наблюдение потребуется отдельно?', 'not-run / not-injected', '«Тест уже подтвердил»'], ['Correction', 'Какой ответ будет допустим после оценки?', 'not-declared', 'Статус исправлено или завершено']]),
h2('Опровержимость начинается с различающего вопроса'),
p('Фальсифицируемость в этом материале не означает выполнить тест ради красной ветки. Она означает заранее назвать различие между «условие неизвестно» и «есть наблюдение, которое в тех же условиях не согласуется с claim». Без этого различия будущий repro становится театром: любой результат можно объяснить сменой версии, а любая версия — объявить новым доказательством. P117 не строит метод прогона. Он сохраняет границу вопроса future-falsification-repro-question-v1, чтобы будущий scope не выдал первый удобный запуск за ответ.'),
p('На практике это означает четыре независимые проверки: имеется ли named claim; имеется ли named condition; pinned ли evidence; не впрыснут ли результат repro. Последняя особенно важна. Реалистичный объект с полем claimed-reproduced выглядит информативнее пустого объекта, но именно поэтому опасен. В плановом редакционном выпуске ему неоткуда взяться. Evaluator не пытается оценить правдоподобие результата и не выбирает частичное принятие: он останавливает весь hand-off. Такой fail-closed путь сохраняет возможность честного будущего исследования.'),
figure('/assets/editorial/2027/mistakes-revisions-2027-condition-correction-matrix.svg', 'Матрица P117 разделяет claim, condition, immutable evidence, contradiction, repro и correction; зелёный путь заканчивается только плановой передачей, а красные клетки показывают состояния, которые evaluator обязан остановить.', 'Матрица описывает синтетическую логику проверки формы. Она не сравнивает реальные версии, не воспроизводит поведение и не устанавливает противоречие старому совету.'),
h2('Runnable пример показывает только границу'),
p('Этот пример читает named fixed in-memory literal, встроенный в модуль. Он не получает параметры процесса, не парсит документацию и не сохраняет результат. Важно не подменять его тем, чем он не является: вызов inspectAdviceBoundaryLiteral не подтверждает, что какая-либо версия определена, а значение not-run не равно неудачному тесту. Это маркировка отсутствия запуска. Без этой маркировки читатель легко сделает противоположные, но одинаково необоснованные выводы: «всё доказано» или «всё уже опровергнуто».'),
code("import { inspectAdviceBoundaryLiteral } from './upgrade-2027-11.mjs';\n\nconst fixedBoundaryQuestion = inspectAdviceBoundaryLiteral();\nconsole.log({\n literal: fixedBoundaryQuestion.literal,\n evidencePin: fixedBoundaryQuestion.evidencePin,\n repro: fixedBoundaryQuestion.repro,\n result: fixedBoundaryQuestion.status,\n effect: fixedBoundaryQuestion.productionEffect,\n});"),
p('Названный literal не является шаблоном, который надо наполнить от руки в запущенном процессе. Evaluator принимает только exact known fixed records после JSON-сравнения. Любой объект с дополнительным полем, другой датой или «полезным» результатом выглядит неизвестным и получает stop-unknown-fixed-literal либо более узкий stop. Это намеренно консервативно: способность угадать дефолт — плохая замена provenance. Сначала появляется разрешённый источник и метод, затем новый scope создаёт отдельный артефакт.'),
h2('Почему mutable документ недостаточен'),
p('Текущая страница документации может быть полезна как ориентир, но не как надёжное доказательство пересмотра. Она способна поменяться после cutoff, переписать термин, скрыть прежнюю оговорку или вести на другую версию. В этой модели допустим только label immutable-version-or-dated-snapshot. Сам label не доказывает, что ссылка найдена; он лишь запрещает принять mutable-current-document. Разница кажется формальной до тех пор, пока поздний читатель не пытается восстановить, на чём держался вывод.'),
p('Не стоит противопоставлять pinned evidence и живую документацию как хорошее и плохое. У них разные роли. Живая страница помогает будущему исследованию понять текущий словарь; pinned материал позволяет сказать, что именно было доступно на обозначенной границе. P117 не собирает ни то ни другое и не устанавливает, что они расходятся. Он только требует не смешивать их в одной ячейке. Если future scope увидит несоответствие, это будет повод сформулировать новый вопрос, а не разрешение задним числом объявить исходный совет неверным.'),
h2('Порядок, который не производит ложный verdict'),
p('Механизм полезен, когда он делает отказ информативным. Stop по пустому condition не говорит «совет плохой»; он говорит «нельзя даже начать сравнение». Stop по mutable evidence не говорит «документация бесполезна»; он говорит «её изменяемость не даёт закрепить основание». Stop по injected repro не говорит «результат невозможен»; он говорит «этот план не имеет права его создавать». Благодаря таким различиям следующий scope получает точную причину, а не общий красный статус.'),
ol(['Зафиксировать temporal boundary P117 и не использовать текущие часы как замену editor date, plan date или cutoff.', 'Выделить one named claim question; не восстанавливать текст утверждения по памяти или из чужого пересказа.', 'Выделить one named condition question и оставить version/applicability неизвестными до отдельного сбора.', 'Потребовать evidence pin уровня immutable version или dated snapshot; mutable reference вернуть в stop без эвристики.', 'Записать contradiction как вопрос о различающем наблюдении, но не выполнять и не описывать repro внутри планового выпуска.', 'Оставить correction/outcome undeclared и передать статус hand-off только в новый разрешённый scope.']),
h2('Граница сравнения важнее количества деталей'),
p('Можно сделать карточку длиннее, добавив предполагаемые команды, поля ответа и пороги. До появления объекта это создаст не метод, а фиктивный протокол. Falsifiability требует не много пунктов, а одного различающего правила: какие условия должны быть сопоставимы, прежде чем наблюдение вообще имеет отношение к claim. P117 не определяет эти условия, поскольку не знает предмета; зато не разрешает спрятать их отсутствие за якобы уже выполненным repro.'),
p('Поэтому stop — не ошибка интерфейса evaluator-а. Он сохраняет точку, в которой требуется новая информация или новая авторизация. Система не заменяет missing condition строкой «default», не берёт актуальную веб-страницу вместо pinned reference и не превращает произвольный input в допустимый case. В будущем это может показаться неудобным, однако именно предсказуемый отказ делает версию, условие и противоречие независимыми объектами проверки.'),
h2('Ограничения механизма'),
p('Эта проверка не выполняет версионное сравнение, diff, HTTP-запрос, чтение файла, browser run, sandbox, тест, reproduction, поиск по архиву или доступ к внешней документации. Она не измеряет совместимость, не выбирает метод доказательства и не назначает владельца. Синтетический status не является quality gate реального продукта. Он подтверждает лишь то, что ограниченный fixed object не содержит заявленной версии, результата или коррекции. Именно поэтому его нельзя использовать как доказательство того, что будущая работа будет завершена.'),
p('Следующий шаг — открыть отдельный scope, только если нужен ответ на один из named вопросов. В нём следует выбрать версию или датированный снимок, описать сравнимые условия, назвать наблюдение, которое действительно могло бы опровергнуть claim, и отделить результат от решения о коррекции. До этого шага P117 не имеет factual verdict. Он сохраняет механизм, который не путает смену контекста с противоречием и не подделывает repro ради завершённости.'),
], commonRefs);
const field = revision({ slug: 'editorial-2027-11-field-mistakes-revisions', title: 'Пересмотр старых советов: корректирующая передача без ложного завершения', categories: ['Процессы', 'Практика'], cover: '/assets/editorial/2027/mistakes-revisions-2027-evidence-handoff-loop.svg', excerpt: 'План P117 на ноябрь 2027: как передать вопрос о возможной коррекции, не объявляя прошлый материал неправильным и не выдавая повторный тест за выполненный.', readingMinutes: 24 }, [
p('В поле самая дорогая ошибка пересмотра звучит убедительно: «старый материал надо признать неправильным и поправить». Такая формула сразу назначает виновника, действие и финал, хотя часто известен только вопрос о применимости. Цена — ложная коррекция попадает в очередь, читатель видит статус как доказательство, а будущая проверка уже вынуждена подгоняться под объявленный исход. Вместо короткого hand-off команда получает обязательство, которого никто не мог обосновать.'),
p('В P117 нет старой статьи, редакционной карточки, автора, владельца, репозитория, теста, прогона, review, публикации, исправления или production result. Все такие предметы существуют только как запрещённые для декларации future question fields. Нельзя сообщать, что old advice ошибочен, correction сделана или rerun завершён. Разрешён положительный результат только synthetic-plan-hand-off и только с productionEffect: not-attempted. Это не отказ от корректности; это отказ выдавать намерение за завершённую работу.'),
h2('Передаётся вопрос, а не приговор'),
p('Корректирующий hand-off начинается с минимальной карточки: есть named claim question, named condition question, named evidence question, named contradiction question и named repro question. Поля correction и handoff тоже названы, но имеют значения not-declared, not-assigned и not-created. Такая карточка не обещает, что кто-то возьмёт её в работу. Она позволяет честно сказать ровно одно: для будущего scope сформулирована граница вопроса, а предмет, доступ и решение ещё отсутствуют.'),
p('Это отличается от очереди. Очередь обычно подразумевает объект, приоритет, исполнителя и готовое действие. Здесь ни один из них не известен. Если заполнить recipient вымышленной ролью, hand-off станет видом назначения. Если назвать correction, он станет видом решения. Если указать outcome, он станет видом отчёта. Evaluator специально закрывает эти случаи, хотя они делают запись удобнее для чтения. Без такого запрета документ незаметно превратится из плана исследования в распоряжение о пересмотре.'),
table('Пакет корректирующей передачи', ['Часть пакета', 'Состояние в P117', 'Зачем оставлено так', 'Что не следует утверждать'], [['Question envelope', 'Named ids, question-only', 'Не смешивать предметы будущей оценки', 'Известна старая ошибка'], ['Evidence boundary', 'Pinned source требуется, state not-collected', 'Не опереться на меняющийся текст', 'Основание уже собрано'], ['Repro boundary', 'not-run / not-injected', 'Не превратить план в результат прогона', 'Тест повторён и подтвердил вывод'], ['Correction', 'not-declared', 'Оставить решение после оценки', 'Материал исправлен'], ['Recipient / handoff', 'not-assigned / not-created', 'Не назначать человека или процесс', 'Есть владелец и работа передана']]),
h2('Разделите исправление, публикацию и эффект'),
p('Даже в настоящем проекте эти три слова не синонимы. Возможная коррекция — решение изменить формулировку или артефакт. Публикация — отдельное действие над определённым каналом. Effect — наблюдение после действия по заранее оговорённому критерию. P117 не имеет ни одного из этих входов, поэтому хранит correction и outcome как undeclared. Эта детализация нужна не ради бюрократии: если назвать effect в момент передачи, получатель уже не сможет отличить гипотезу пользы от полученного результата.'),
p('Особенно вредна фраза «повторный тест закончен». Она склеивает метод, среду, вход, наблюдение и интерпретацию в два слова. В plan/scenario нет права добавлять такой факт, даже как иллюстрацию. Поле future-handoff-repro-question-v1 лишь резервирует тему будущей проверки. Его state not-run не указывает на сбой, задержку или отказ от работы; он фиксирует отсутствие запуска в этом пакете. Любой injected result — положительный или отрицательный — закрывает evaluator, потому что модель не читает внешние данные.'),
figure('/assets/editorial/2027/mistakes-revisions-2027-evidence-handoff-loop.svg', 'Петля передачи P117: named questions о claim, condition, evidence и repro идут к отдельному будущему scope; correction, recipient и outcome остаются undeclared, поэтому петля не заканчивается публикацией или production эффектом.', 'Диаграмма показывает границу корректирующей передачи. Она не отображает реального владельца, статью, тест, исправление, публикацию, проверку или достигнутый результат.'),
h2('Runnable пример не создаёт работу'),
p('Модуль ниже полностью self-contained. Named literal уже лежит в памяти и глубоко заморожен; функция возвращает компактное описание его статуса. Она не создаёт задачу, issue, комментарий, файл, письмо, уведомление, pull request или запись в очереди. Отсутствие I/O важно здесь больше, чем красивый workflow: учебная функция не должна иметь скрытого канала, через который «передача» станет настоящим организационным событием. Запуск показывает контракт отказа от ложного завершения, а не прогресс процесса.'),
code("import { inspectAdviceHandoffLiteral } from './upgrade-2027-11.mjs';\n\nconst fixedHandoffQuestion = inspectAdviceHandoffLiteral();\nconsole.log({\n literal: fixedHandoffQuestion.literal,\n correction: fixedHandoffQuestion.correction,\n recipient: fixedHandoffQuestion.recipient,\n result: fixedHandoffQuestion.status,\n effect: fixedHandoffQuestion.productionEffect,\n});"),
p('Здесь нет функции assignOwner, потому что её появление противоречило бы предмету статьи. Нельзя заменить отсутствующее полномочие красивым названием роли вроде «editor» или «maintainer»: имя само по себе уже объявляет адресата. Аналогично нельзя добавить publish: false и считать это безопасным моделированием публикации. Лучше вообще не создавать действие, чем создавать его тень и потом спорить, была ли она частью факта. P117 формирует только вопросную структуру и следующую границу авторизации.'),
h2('Коррекция может быть одним из будущих исходов, но не текущим статусом'),
p('Сохранение вопроса о коррекции не делает исход предрешённым. Future scope может обнаружить, что condition был неверно понят, evidence недостаточно, repro нерепрезентативен или claim вообще нельзя восстановить. В каждом случае правильным результатом может быть отсутствие коррекции. Эта возможность теряется, если initial hand-off уже говорит «исправить». Поэтому evaluator не принимает declared-correct и declared-complete: они превращают открытый вопрос в смоделированную победу без источника.'),
p('Обратная ошибка — считать отказ от verdict-а бездействием. Нет: hand-off содержит практический следующий шаг и точные stop reasons. Будущий исследователь узнаёт, чего не хватает: даты, имени claim, имени condition, immutable pin, чистого repro или undeclared correction. Такая точность сокращает повторную трактовку, не обещая результата. В отличие от общего «нужно разобраться», она задаёт минимальный вход для следующего решения и не делает вид, что этот вход уже получен.'),
h2('Что должен получить следующий scope'),
p('Получатель не обязан соглашаться с framing карточки. Он может вернуть её, если claim слишком широк, condition не даёт отделить режимы, источник нельзя закрепить или planned repro не различает альтернативы. Такой возврат не равен отказу от коррекции: он не позволяет потратить доверие читателя на преждевременный verdict. Для P117 это единственный полезный критерий hand-off — вопрос стал достаточно явным, чтобы его можно было отклонить по конкретной причине, а не по настроению.'),
p('В карточке сознательно нет поля «срочно». Срочность принадлежит отдельной ситуации с доступным объектом, риском и полномочием на решение. В future-only плане она лишь подталкивает автора назвать correction раньше evidence. Если впоследствии появится причина ускорить работу, она должна быть записана в новом артефакте с собственной датой и границей. Ноябрьский сценарий не может получить эту причину задним числом.'),
h2('Порядок корректирующей передачи'),
ol(['Зафиксировать, что P117 является future-only сценарием: editor date 2026-07-31, plan date 2027-11, source cutoff 2026-07-31.', 'Описать scope именованными question fields и не добавлять название, цитату или оценку несуществующего старого материала.', 'Проверить, что claim и condition имеют ids, а их содержание, версия и применимость остаются not-collected.', 'Оставить evidence неполученным и допустить только immutable version либо dated snapshot как будущую форму привязки.', 'Оставить repro в not-run / not-injected, correction/outcome — not-declared, recipient/handoff — not-assigned / not-created.', 'Передать synthetic-plan-hand-off как запрос на новый authorised scope, не как задачу, приказ, публикацию или подтверждённый результат.']),
h2('Ограничения и следующий шаг'),
p('P117 не проверяет факты о прошлых публикациях и не защищает читателя от всех неверных советов. Он не открывает архив, registry, README, articles.json, очередь, app, package, сеть, документацию, журнал тестов или production. Он не назначает owner, не ставит срок и не выбирает платформу для дальнейшей работы. Источники ниже нужны лишь для словаря происхождения, изменения конфигурации и точной записи даты. Они не утверждают, что в данном выпуске был совет, спор, коррекция или hand-off.'),
p('Следующий шаг должен быть маленьким и отдельно разрешённым: принять один named question field как предмет исследования, определить доступный immutable source, описать возможный repro без результата и только затем решить, нужна ли коррекция. Если полномочия, объект или evidence не появляются, корректный ответ — оставить hand-off не созданным. Это не незавершённость текста; это честная граница между планом и действием. P117 не объявляет старый материал ошибочным и не обещает, что повторный тест когда-либо будет завершён.'),
], commonRefs);
export const revisions = deepFreeze([practice, mechanism, field]);
if (process.argv.includes('--verify-fixture')) {
const result = runAdviceRevisionFixture();
if (!result.accepted) process.exitCode = 1;
process.stdout.write(`PASS fixture: ${result.passed}/${result.total} assertions\n`);
} else if (process.argv.includes('--print-revisions')) {
process.stdout.write(JSON.stringify(revisions, null, 2) + '\n');
}