13 KiB
P107 — January 2027: «Десять лет web-диагностики»
Статус, граница времени и scope
Редакторская дата: 31 июля 2026. Январь 2027 ещё не наступил. Все три текста прямо обозначены как план/сценарий на 2027-01 с source cutoff 2026-07-31. Это не ретроспектива о завершённых десяти годах, не historical report и не описание реального incident.
Для P107 нет bug reports, logs, traces, repro, tool output, production incidents, customer data или historical artifacts. Очередь ожидает такие артефакты, но этот пакет их не создаёт и не имитирует. Термины из официальных источников отделены от synthetic модели: source говорит о формате или словаре, но не подтверждает конкретную web-систему, carrier, запись, причинность либо результат расследования.
Исполняемый пример принимает только named fixed in-memory literals. Factory выполняет JSON clone, затем deep freeze; evaluator принимает только JSON-равный известный literal и fail-closed закрывает всё остальное. Он не читает и не меняет сеть, browser, файлы, environment, clock, secrets, telemetry backend, external tools или production. Единственный допустимый положительный output — synthetic-plan-hand-off с productionEffect: not-attempted; root cause, fix, rollout, report, incident и любой положительный production conclusion запрещены.
Изменены только следующие файлы:
web/scripts/upgrade-2027-01.mjseditorial/reviews/2027-01-draft.mdweb/public/assets/editorial/2027/debugging-decade-2027-evolution-timeline.svgweb/public/assets/editorial/2027/debugging-decade-2027-signal-tool-limit-table.svgweb/public/assets/editorial/2027/debugging-decade-2027-hypothesis-evidence-loop.svg
Registry, README, articles.json, app, очередь, P102–P106 и Git-state не менялись.
Pinned primary sources и границы
- W3C Trace Context, W3C Recommendation, 23 November 2021. Использован только для терминологической границы стандартизированного propagation trace context. Не подтверждает trace, carrier, связь или причинность в P107.
- RFC 5424: The Syslog Protocol, March 2009, DOI
10.17487/RFC5424. Использован только для различения формата protocol message и фактической записи. Не создаёт log record, report или history. - NIST SP 800-92: Guide to Computer Security Log Management, September 2006, DOI
10.6028/NIST.SP.800-92. Использован как общий контекст дисциплины provenance и log management. Не подтверждает сбор, retention, incident или расследование.
Все три источника первичные, pinned и не позднее cutoff. Имена fixed cases, статусы, правило «evidence не сильнее input», диаграммы, таблицы и safe hand-off — собственная synthetic модель P107, не вывод этих источников.
Review pass 1 — три разных редакционных фокуса
- Practice: аккуратная карта от synthetic симптома к именованной гипотезе и planned signals. В первых двух абзацах названы ранний прыжок к причине и ретроспективный вымысел; цена — обратные изменения, шум и ложная память. Статья не предлагает универсальный метод и не приписывает историю конкретной команде.
- Mechanism: что не меняется между log, trace, metric и новым UI: named input, правило связи, альтернативное объяснение и предел силы вывода. В начале названа ложная причинность по id и цена — исключение не исключённых альтернатив. Отдельно разведены schema, поле, collector, время и evidence.
- Field: synthetic debugging hand-off без field artifact. В начале названа передача «причина подтверждена» без материала и цена — ложная операционная память. Таблица и схема описывают лишь форму будущей передачи; они не называют project, tool, person, incident, время или production effect.
- Голос M10: короткая прагматичная русская техническая речь наставника, с прямыми ограничениями и без обещания одного метода для всех систем.
Review pass 2 — literal safety и temporal integrity
- Положительный
planned-handoff-v1требуетplanDate: 2027-01,sourceCutoff: 2026-07-31, named symptom/hypothesis/signals иevidence: synthetic-contract/input/not-collected. undated-scenario-v1→stop-undated-scenario-or-cutoff.unnamed-signal-v1→stop-unnamed-signal;unnamed-hypothesis-v1→stop-unnamed-symptom-or-hypothesis.evidence-stronger-than-input-v1→stop-evidence-stronger-than-input: synthetic plan не может заявитьobservedилиclaimed-collectedevidence.positive-conclusion-v1→stop-disallowed-positive-conclusion:root-cause-confirmedзапрещён.- Factory использует JSON clone и deep freeze, включая nested
signals. Произвольный или изменённый input →stop-unknown-fixed-input. Допустимая ветка возвращает толькоsynthetic-plan-hand-off,productionEffect: not-attemptedи future evidence owner action.
Review pass 3 — visuals, доступность, неповторяемость
- У каждого SVG есть русские
titleиdesc, а у соответствующей статьи — русские meaningful alt и caption. Изображения содержат механизм: timeline с двумя stop, сравнительную таблицу пределов inference и loop hand-off. - XML validation прошла для всех трёх SVG. Safety scan не нашёл
script,foreignObject,javascript:,data:imageили inline event handlers; внешних ссылок в SVG нет. - Sharp создал три PNG шириной 375 px. Ручной visual inspection подтвердил: заголовки и подписи не обрезаны; practice сохраняет все четыре узла и два stop; mechanism читает все четыре строки таблицы и красные запреты; field сохраняет направления синей и красных стрелок и читаемые stop-блоки.
- Строгий pairwise scan исключал section sources, но включал code. Общих точных фрагментов по 12 слов: practice/mechanism
0, practice/field0, mechanism/field0.
Actual verification commands and results
Запущено из web/:
node --check scripts/upgrade-2027-01.mjs
node scripts/upgrade-2027-01.mjs --verify-fixture
npm run audit:draft -- scripts/upgrade-2027-01.mjs
node --input-type=module -e "import { createFixedDiagnosticCase, assessFixedDiagnosticPlan } from './scripts/upgrade-2027-01.mjs'; const ids=['planned-handoff-v1','undated-scenario-v1','unnamed-signal-v1','unnamed-hypothesis-v1','evidence-stronger-than-input-v1','positive-conclusion-v1']; for (const id of ids) console.log(id, assessFixedDiagnosticPlan(createFixedDiagnosticCase(id)).status); const accepted=assessFixedDiagnosticPlan(createFixedDiagnosticCase()); console.log('exports-frozen', Object.isFrozen(createFixedDiagnosticCase()), Object.isFrozen(createFixedDiagnosticCase().signals), accepted.productionEffect);"
xmllint --noout public/assets/editorial/2027/debugging-decade-2027-evolution-timeline.svg public/assets/editorial/2027/debugging-decade-2027-signal-tool-limit-table.svg public/assets/editorial/2027/debugging-decade-2027-hypothesis-evidence-loop.svg
! rg -n -i "<(script|foreignObject)\\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=" public/assets/editorial/2027/debugging-decade-2027-evolution-timeline.svg public/assets/editorial/2027/debugging-decade-2027-signal-tool-limit-table.svg public/assets/editorial/2027/debugging-decade-2027-hypothesis-evidence-loop.svg
node --input-type=module -e "import sharp from 'sharp'; for (const n of ['debugging-decade-2027-evolution-timeline','debugging-decade-2027-signal-tool-limit-table','debugging-decade-2027-hypothesis-evidence-loop']) await sharp('public/assets/editorial/2027/'+n+'.svg').resize({width:375}).png().toFile('/private/tmp/'+n+'-375.png');"
node --input-type=module -e "import { revisions } from './scripts/upgrade-2027-01.mjs'; const text=h=>h.replace(/<h2>Проверяемые источники<\\/h2>[\\s\\S]*/, '').replace(/<[^>]+>/g,' ').replace(/&(?:quot|amp|lt|gt|#039);/g,' ').toLowerCase().replace(/[^a-zа-яё0-9]+/giu,' ').trim().split(/\\s+/); const grams=a=>new Set(a.slice(0,-11).map((_,i)=>a.slice(i,i+12).join(' '))); for (let i=0;i<revisions.length;i++) for(let j=i+1;j<revisions.length;j++){const left=text(revisions[i].contentHtml), right=text(revisions[j].contentHtml), common=[...grams(left)].filter(x=>grams(right).has(x)); console.log(revisions[i].slug+' <> '+revisions[j].slug, 'shared-12-word-fragments='+common.length); if(common.length) console.log(common.join('\\n'));}"
Results:
- Syntax: PASS (
node --checkexit 0). - Fixture and article guard: PASS
9/9; fixture6/6; all three article checkstrue. - Article volumes: practice
9,066, mechanism9,041, field9,238body characters; all are within the required 5,000–15,000 range and the 9–13k target. npm run audit:draft: three PASS lines, one per exact required slug.- Public literal exports: PASS. Six status results exactly matched their expected branches;
exports-frozen true true not-attempted. xmllint: PASS with no output. SVG safety: PASS,rgfound no forbidden content. Sharp render: PASS for all three outputs; all three 375 px PNG files were visually inspected.- Pairwise duplicate scan: PASS,
shared-12-word-fragments=0for all three pairs, with code included and sources excluded.
The only non-failing command output was the existing npm warning about unknown user config (store-dir, cache-dir, public-hoist-pattern); it did not affect the audit result.
Независимая приёмка основного редактора — 31.07.2026
Принято только как плановый выпуск на январь 2027. Названы 2027-01 и cutoff 2026-07-31; нет вымышленной декады, incident, log, trace, repro или production-вывода. Positive output не сильнее synthetic-plan-hand-off c productionEffect: not-attempted.
W3C Trace Context заменён на датированную Recommendation 23.11.2021, чтобы ссылка не указывала на изменяемую current-страницу. RFC 5424 и NIST SP 800-92 остаются первичными источниками формата и log-management vocabulary; все три источника используются только для терминов, не для доказательства route, carrier, записи или причинности P107.
Повторные проверки: syntax; fixture/guard 9/9 (fixture 6/6); draft audit с объёмами 9 266 / 9 041 / 9 238; XML и SVG safety-scan. Literal exports подтвердили все six expected branches, включая stop-unnamed-signal, stop-unnamed-symptom-or-hypothesis, stop-evidence-stronger-than-input и stop-disallowed-positive-conclusion. Sharp PNG трёх SVG осмотрены на 375 px: подписи, строки таблицы, arrows и stop labels читаемы. После замены формата practice snippet строгий cross-package scan 18 статей августа 2026 — января 2027 дал collisions: [].
В registry добавлены только три январские ревизии. Пользовательские application-файлы, articles.json, production queue и прочая незакоммиченная работа не входят в приёмку.