98 lines
12 KiB
Markdown
98 lines
12 KiB
Markdown
# P111 — May 2027: «Полевой справочник HTTP и TLS»
|
||
|
||
## Статус и временная граница
|
||
|
||
Редакторская дата: **31 июля 2026**. Май 2027 ещё не наступил. Три материала — строго **plan/scenario на 2027-05** с source cutoff **2026-07-31**. Они не описывают controlled handshake, HTTP trace, cURL/OpenSSL run, endpoint, client configuration, certificate, error или production result. Названия cURL/OpenSSL присутствуют только как будущие средства со state limit `command: not-run`; endpoint, client configuration и trace остаются `not-collected`.
|
||
|
||
Модуль принимает только named fixed synthetic cases и fixed in-memory literals. Factory выполняет JSON clone и recursive deep freeze; evaluator fail-closed сравнивает input с known literal. Положительный output ровно один: `synthetic-plan-hand-off` с `productionEffect: not-attempted`. Код не читает сеть, socket, browser, files, environment, clock, secrets, telemetry, external tools или production и не пытается получить HTTP/TLS-результат.
|
||
|
||
## Источники и boundary
|
||
|
||
1. [RFC 9110 — HTTP Semantics](https://www.rfc-editor.org/rfc/rfc9110), June 2022, DOI `10.17487/RFC9110`. Первичный pinned источник HTTP semantics. Он не подтверждает конкретное сообщение, header, endpoint, response или server state.
|
||
2. [RFC 9112 — HTTP/1.1](https://www.rfc-editor.org/rfc/rfc9112), June 2022, DOI `10.17487/RFC9112`. Первичный pinned источник HTTP/1.1 framing. Он не доказывает bytes, ошибку или transport поведение неизвестного соединения.
|
||
3. [RFC 9114 — HTTP/3](https://www.rfc-editor.org/rfc/rfc9114), June 2022, DOI `10.17487/RFC9114`. Первичный pinned источник HTTP/3/QUIC mapping. Он не утверждает доступность HTTP/3 в конкретном клиенте или service.
|
||
4. [RFC 8446 — TLS 1.3](https://www.rfc-editor.org/rfc/rfc8446), August 2018, DOI `10.17487/RFC8446`. Первичный pinned источник TLS 1.3 handshake vocabulary. Он не заменяет certificate chain, policy, negotiated parameters или trace.
|
||
|
||
Все источники датированы не позже cutoff. В P111 не заявляется current cURL/OpenSSL behavior: exact pinned release source для такой версии/build/option semantics не верифицирован, а command output не изобретался.
|
||
|
||
## Review pass 1 — фокус, проблема и форма
|
||
|
||
- **Practice** начинает с стоимости смешения HTTP semantics, framing, TLS и policy, затем строит versioned question map. Он не использует default «HTTPS» и передаёт только named protocol/version question.
|
||
- **Mechanism** начинает с цены неверного inference между уровнями. Угол — границы между semantic, framing, TLS negotiation и client-policy error classes без диагностики существующего error.
|
||
- **Field** начинает с стоимости выданного за отчёт вопроса. Угол — synthetic evidence hand-off с provenance и state limits, а не сетевой report.
|
||
- Во всех первых двух абзацах есть concrete issue/cost, дата, cutoff, запрет на реальные network facts и единственный allowed positive outcome. Тон M10: короткая прикладная русская техническая проза без generic protocol tips.
|
||
- В каждом revision есть механизм, accessible HTML table, own SVG с русскими alt/caption, safe runnable literal, ordered action sequence, limits и next step. Финальные body lengths: practice — `10 000`, mechanism — `10 216`, field — `10 058` знаков.
|
||
|
||
## Review pass 2 — literal safety и доказательная граница
|
||
|
||
- `undated-plan-or-cutoff-v1` получает `stop-undated-plan-or-cutoff`; редакционная дата и cutoff не подставляются по умолчанию.
|
||
- `unnamed-protocol-or-version-question-v1` получает `stop-unnamed-protocol-or-version-question`; protocol/version question не угадывается.
|
||
- `evidence-stronger-than-input-v1` получает `stop-evidence-stronger-than-input`; `claimed` result, header finding, certificate conclusion или иной stronger output не допускается из `not-collected/input-bounded` input.
|
||
- `hidden-command-endpoint-or-config-v1` получает `stop-hidden-command-endpoint-or-config`; команда, endpoint, client configuration и trace могут быть только `not-run/not-collected`.
|
||
- `disallowed-positive-network-conclusion-v1` получает `stop-disallowed-positive-network-conclusion`; handshake success, response success, remediation и production result запрещены.
|
||
- JSON clone + recursive deep freeze закрепляют nested `protocolQuestion` и `evidence`; unknown object получает `stop-unknown-fixed-input`. Runnable examples не импортируют network libraries и не вызывают cURL/OpenSSL.
|
||
|
||
## Review pass 3 — SVG, мобильный осмотр и фактические проверки
|
||
|
||
- Все SVG имеют русские `title` и `desc`, article alt/caption, data-bearing content. В них нет внешних ссылок, `script`, `foreignObject`, `javascript:`, `data:image` или event handlers.
|
||
- Sharp-рендеры в ширине 375px осмотрены вручную: handshake/header map сохраняет четыре границы и зелёный hand-off; matrix сохраняет четыре колонки и красные inference limits; evidence loop сохраняет три gates, stop и hand-off. Обрезания не обнаружены.
|
||
- Строгая попарная проверка исключает source section, но извлекает и `<p>`, и `<pre>` — runnable code участвует в scan. Результат для всех пар: `exactParagraphs160: 0`, `common12WordFragments: 0`.
|
||
|
||
Фактически выполненные команды из `web/`:
|
||
|
||
```sh
|
||
node --check scripts/upgrade-2027-05.mjs
|
||
node scripts/upgrade-2027-05.mjs --verify-fixture
|
||
npm run audit:draft -- scripts/upgrade-2027-05.mjs
|
||
node --input-type=module -e "import { createFixedHttpTlsCase, assessFixedHttpTlsPlan } from './scripts/upgrade-2027-05.mjs'; for (const id of ['planned-http-tls-question-v1','undated-plan-or-cutoff-v1','unnamed-protocol-or-version-question-v1','evidence-stronger-than-input-v1','hidden-command-endpoint-or-config-v1','disallowed-positive-network-conclusion-v1']) console.log(id, assessFixedHttpTlsPlan(createFixedHttpTlsCase(id)).status);"
|
||
xmllint --noout public/assets/editorial/2027/http-tls-guide-2027-handshake-header-map.svg public/assets/editorial/2027/http-tls-guide-2027-symptom-boundary-matrix.svg public/assets/editorial/2027/http-tls-guide-2027-evidence-handoff-loop.svg
|
||
rg -n -i "<(script|foreignObject)\\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=" public/assets/editorial/2027/http-tls-guide-2027-handshake-header-map.svg public/assets/editorial/2027/http-tls-guide-2027-symptom-boundary-matrix.svg public/assets/editorial/2027/http-tls-guide-2027-evidence-handoff-loop.svg
|
||
node --input-type=module -e "import sharp from 'sharp'; for (const n of ['http-tls-guide-2027-handshake-header-map','http-tls-guide-2027-symptom-boundary-matrix','http-tls-guide-2027-evidence-handoff-loop']) { const out='/private/tmp/'+n+'-375.png'; const info=await sharp('public/assets/editorial/2027/'+n+'.svg').resize({width:375}).png().toFile(out); console.log(out, info.width+'x'+info.height); }"
|
||
```
|
||
|
||
Строгий pairwise scan (sources исключены, code включён) выполнен этим кодом:
|
||
|
||
```js
|
||
const source = /<h2>Проверяемые источники[\s\S]*$|<h2>Проверяемые источники<\/h2>[\s\S]*$/;
|
||
const clean = (html) => html.replace(source, '');
|
||
const plain = (html) => clean(html).replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
|
||
const paragraphs = (html) => clean(html).match(/<(?:p|pre)\b[^>]*>[\s\S]*?<\/(?:p|pre)>/g)?.map(plain).filter((x) => x.length >= 160) ?? [];
|
||
const grams = (text) => { const words = text.toLowerCase().replace(/[^a-zа-яё0-9]+/giu, ' ').trim().split(/\s+/); const out = new Set(); for (let i = 0; i <= words.length - 12; i++) out.add(words.slice(i, i + 12).join(' ')); return out; };
|
||
// Для каждой пары: exactParagraphs160 = пересечение paragraphs;
|
||
// common12WordFragments = пересечение grams(plain(contentHtml)).
|
||
```
|
||
|
||
Фактические результаты: syntax — pass; fixture — `9/9` (`6/6` literals + `3/3` article checks); audit — pass для трёх exact slug с lengths `10 000 / 10 216 / 10 058`; public exports дали один `synthetic-plan-hand-off` и пять ожидаемых stop-status; `xmllint` — pass; SVG safety scan — empty/pass; Sharp — три файла `375x225`; visual inspection — pass; strict pairwise duplicate scan — нули по обеим метрикам во всех трёх парах.
|
||
|
||
## Disposition
|
||
|
||
Изменены только пять файлов P111:
|
||
|
||
- `web/scripts/upgrade-2027-05.mjs`
|
||
- `editorial/reviews/2027-05-draft.md`
|
||
- `web/public/assets/editorial/2027/http-tls-guide-2027-handshake-header-map.svg`
|
||
- `web/public/assets/editorial/2027/http-tls-guide-2027-symptom-boundary-matrix.svg`
|
||
- `web/public/assets/editorial/2027/http-tls-guide-2027-evidence-handoff-loop.svg`
|
||
|
||
Registry, README, `articles.json`, app, queue, P102–P110 и Git-state не менялись. P111 заканчивается только synthetic plan hand-off; `productionEffect: not-attempted` не является наблюдением о сети или production.
|
||
|
||
## Независимая приёмка — 2026-07-31
|
||
|
||
### Проход 1 — источники, фактическая граница и голос
|
||
|
||
- RFC 9110, 9112, 9114 и 8446 проверены как первичные датированные спецификации. Они поддерживают только vocabulary для HTTP semantics/framing, HTTP/3 и TLS 1.3; текст не делает из них вывод о конкретном handshake, certificate, response, endpoint или client behavior.
|
||
- Три статьи не превращаются в общий справочник: practice строит карту вопроса, mechanism запрещает межуровневый inference, field описывает provenance hand-off. У каждого текста собственная цена ошибки, таблица, пример и следующий шаг.
|
||
- Указаны planDate 2027-05 и cutoff 2026-07-31; слова о cURL/OpenSSL удержаны на уровне будущего `not-run`, без неподтверждённого version/option claim.
|
||
|
||
### Проход 2 — исполнимый контракт и автоматический аудит
|
||
|
||
- `node --check`, fixture `9/9`, public literal check и `npm run audit:draft -- scripts/upgrade-2027-05.mjs` прошли. Длины body: 10 000, 10 216 и 10 058 знаков.
|
||
- Единственная accepted ветвь — `synthetic-plan-hand-off`; пять контрпримеров останавливаются fail-closed. Deep freeze охватывает nested protocol question и evidence, а accepted output оставляет `productionEffect: not-attempted`.
|
||
- `xmllint` проходит без output; safety scan не обнаружил active content в трёх SVG.
|
||
|
||
### Проход 3 — визуал, уникальность и выпуск
|
||
|
||
- SVG отрендерены и просмотрены в ширине 375 px: карта удерживает четыре диагностические границы, matrix — все колонки и пределы inference, loop — три gate, stop и hand-off.
|
||
- Строгий cross-package scan P102–P111 исключает sources, но включает code. Для 30 статей результат `collisions: []`.
|
||
- В реестр добавлены ровно три майские revisions; пользовательские app/data files не включены.
|