This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
# 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.mjs`
|
||||
- `editorial/reviews/2027-01-draft.md`
|
||||
- `web/public/assets/editorial/2027/debugging-decade-2027-evolution-timeline.svg`
|
||||
- `web/public/assets/editorial/2027/debugging-decade-2027-signal-tool-limit-table.svg`
|
||||
- `web/public/assets/editorial/2027/debugging-decade-2027-hypothesis-evidence-loop.svg`
|
||||
|
||||
Registry, README, `articles.json`, app, очередь, P102–P106 и Git-state не менялись.
|
||||
|
||||
## Pinned primary sources и границы
|
||||
|
||||
1. [W3C Trace Context](https://www.w3.org/TR/2021/REC-trace-context-1-20211123/), W3C Recommendation, 23 November 2021. Использован только для терминологической границы стандартизированного propagation trace context. Не подтверждает trace, carrier, связь или причинность в P107.
|
||||
2. [RFC 5424: The Syslog Protocol](https://www.rfc-editor.org/rfc/rfc5424), March 2009, DOI `10.17487/RFC5424`. Использован только для различения формата protocol message и фактической записи. Не создаёт log record, report или history.
|
||||
3. [NIST SP 800-92: Guide to Computer Security Log Management](https://doi.org/10.6028/NIST.SP.800-92), 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-collected` evidence.
|
||||
- `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/field `0`, mechanism/field `0`.
|
||||
|
||||
## Actual verification commands and results
|
||||
|
||||
Запущено из `web/`:
|
||||
|
||||
```sh
|
||||
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 --check` exit 0).
|
||||
- Fixture and article guard: PASS `9/9`; fixture `6/6`; all three article checks `true`.
|
||||
- Article volumes: practice `9,066`, mechanism `9,041`, field `9,238` body 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, `rg` found 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=0` for 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 и прочая незакоммиченная работа не входят в приёмку.
|
||||
Reference in New Issue
Block a user