This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Производство редакционных партий
|
||||
|
||||
На 31 июля 2026 года строгий аудит проходит 18 из 358 созданных материалов. Остальные 340 не считаются «почти готовыми»: их нужно заменить, а не косметически удлинить.
|
||||
На 31 июля 2026 года строгий аудит проходит 24 из 358 созданных материалов. Остальные 334 не считаются «почти готовыми»: их нужно заменить, а не косметически удлинить.
|
||||
|
||||
## Одна партия
|
||||
|
||||
|
||||
@@ -0,0 +1,144 @@
|
||||
# Июль 2018 — тройное ревью: таймауты веб-интеграции
|
||||
|
||||
Статус: принят в публикационный слой 31 июля 2026 года. Пакет не
|
||||
перезаписывает <code>web/data/articles.json</code>:
|
||||
<code>web/data/editorial-revisions.mjs</code> сопоставляет три ревизии только
|
||||
по стабильным slug.
|
||||
|
||||
Партия:
|
||||
|
||||
- <code>editorial-2018-07-practice-http-timeouts</code>
|
||||
- <code>editorial-2018-07-mechanism-http-timeouts</code>
|
||||
- <code>editorial-2018-07-field-http-timeouts</code>
|
||||
|
||||
## Карта покрытия
|
||||
|
||||
| Перспектива | Главный вопрос | Основной текст без источников | Артефакт |
|
||||
| --- | --- | ---: | --- |
|
||||
| Практика | Как задать бюджет одного PHP cURL-вызова | 7 963 знака | конфигурация cURL, временная шкала и правило повтора |
|
||||
| Механизм | Чем отличаются connect, total и low speed | 8 813 знаков | матрица стадий, временные поля cURL и условия повторов |
|
||||
| Поле | Как разобрать зависание по наблюдаемым стадиям | 9 588 знаков | trace, локальный тестовый сервер и дерево диагностики |
|
||||
|
||||
У каждой ревизии есть 8, 9 и 9 заголовков второго уровня соответственно,
|
||||
одна доступная таблица с <code>thead</code> и <code>scope</code>, один рисунок
|
||||
с непустым <code>alt</code> и подписью, 2–3 блока кода, нумерованный порядок
|
||||
действий, ограничения и точный заголовок
|
||||
<code><h2>Проверяемые источники</h2></code>.
|
||||
|
||||
## 1. Факты и техника — пройдено
|
||||
|
||||
### Границы cURL
|
||||
|
||||
- Официальная документация libcurl сверена для
|
||||
<a href="https://curl.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html">CURLOPT_CONNECTTIMEOUT</a>,
|
||||
<a href="https://curl.se/libcurl/c/CURLOPT_TIMEOUT.html">CURLOPT_TIMEOUT</a>,
|
||||
<a href="https://curl.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html">LOW_SPEED_LIMIT</a>,
|
||||
<a href="https://curl.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html">LOW_SPEED_TIME</a>
|
||||
и <a href="https://curl.se/libcurl/c/curl_easy_getinfo.html">curl_easy_getinfo</a>.
|
||||
- Текст не называет общий <code>CURLOPT_TIMEOUT</code> «read timeout».
|
||||
В нём он ограничивает весь перенос; пара LOW_SPEED_LIMIT и LOW_SPEED_TIME
|
||||
описана как граница средней скорости ниже порога за период.
|
||||
- Указано, что connect phase включает DNS и протокольные переговоры до
|
||||
установленного соединения, а connect timeout находится внутри общего
|
||||
timeout. Бюджеты не складываются.
|
||||
- <a href="https://curl.se/libcurl/c/libcurl-errors.html">CURLE_OPERATION_TIMEDOUT (28)</a>
|
||||
используется только как итог достижения условия таймаута. Статьи требуют
|
||||
записывать пороги, HTTP-код и временные отметки, а не угадывают по одному
|
||||
коду ошибочную стадию.
|
||||
|
||||
### Повторы и HTTP
|
||||
|
||||
- Для исторической точности сверены
|
||||
<a href="https://datatracker.ietf.org/doc/html/rfc7231#section-4.2.2">RFC 7231, раздел 4.2.2</a>,
|
||||
действовавший в 2018 году, и актуальный
|
||||
<a href="https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2">RFC 9110, раздел 9.2.2</a>.
|
||||
- Ни одна статья не советует «просто повторить запрос». GET и HEAD получают
|
||||
только один ограниченный повтор в остатке бюджета. Изменение состояния
|
||||
требует постоянного ключа операции и документированной дедупликации у
|
||||
партнёра либо проверки статуса. Без этого результат обозначается
|
||||
неопределённым.
|
||||
- Примеры с локальной задержкой помечены как учебные. В текст не добавлены
|
||||
вымышленные метрики, пользователи, результаты инструментов или состояние
|
||||
внешнего сервиса.
|
||||
|
||||
### Исполнимость кода
|
||||
|
||||
- Примеры используют синхронный PHP cURL, доступный для эпохи 2018 года:
|
||||
<code>curl_exec</code>, <code>curl_getinfo</code>,
|
||||
<code>CURLOPT_CONNECTTIMEOUT</code>, <code>CURLOPT_TIMEOUT</code> и
|
||||
базовые временные поля.
|
||||
- Код читает диагностику до <code>curl_close</code>, отделяет transport error
|
||||
от HTTP-кода и не записывает в обязательный trace токен, тело запроса или
|
||||
ответ партнёра.
|
||||
|
||||
Вердикт первого прохода: утверждения о cURL, HTTP и повторах имеют первичную
|
||||
опору; ложных обещаний и небезопасного автоматического повтора нет.
|
||||
|
||||
## 2. Редактура и голос — пройдено
|
||||
|
||||
- Первый абзац каждой статьи называет симптом и цену ошибки: занятый пул PHP,
|
||||
шестидесятисекундное ожидание или неизвестное состояние синхронизации.
|
||||
- Каждая статья держит один главный вопрос. Практика строит бюджет, механизм
|
||||
разделяет настройки, поле ведёт расследование по trace. Три текста не
|
||||
пересказывают друг друга.
|
||||
- Речь соответствует М1 2018 года: PHP, cURL, HTTP, DNS, TLS, журнал и
|
||||
локальный тест. Автор ведёт читателя через «сначала проверяем — затем
|
||||
меняем», без позднего жаргона SLO, распределённой трассировки или
|
||||
неподтверждённых показателей.
|
||||
- Технический ход сохраняется в каждом разделе: симптом → граница →
|
||||
проверка → действие → ограничение. Общие вводные и слова без проверяемого
|
||||
объекта не использованы.
|
||||
- В конце есть критерий результата: trace указывает на стадию, одно
|
||||
ограничение меняется после проверки, а безопасный повтор определяется
|
||||
контрактом операции.
|
||||
|
||||
Вердикт второго прохода: объём находится в интервале 5 000–15 000 знаков,
|
||||
голос не опережает 2018 год, а плотность текста не держится на общих оценках.
|
||||
|
||||
## 3. Визуал и выпуск — пройдено для черновика
|
||||
|
||||
- Повторный независимый strict-проход остановил практическую статью: первые
|
||||
800 знаков содержали конкретный сценарий и цену, но не явный маркер
|
||||
симптома. Первое предложение исправлено на <code>Симптом: карточка
|
||||
товара...</code>; сценарий, причина и цена ошибки сохранены.
|
||||
- Созданы три разные SVG: временной бюджет запроса, границы таймаутов и
|
||||
дерево полевого разбора. Каждая схема передаёт решение из соответствующей
|
||||
статьи, а не повторяет заголовок.
|
||||
- Все SVG прошли <code>xmllint --noout</code>. Затем они были реально
|
||||
растрированы через <code>sharp</code> в исходном размере и на ширине
|
||||
343 px. Проверены границы canvas, контраст и читаемость ключевых заголовков.
|
||||
- В первой визуальной версии длинные строки в схеме механизма заходили на
|
||||
цветные плашки, а нижние решения в схеме полевого разбора не помещались
|
||||
в карточки. Перед этим вердиктом подписи разбиты по строкам, карточки
|
||||
увеличены; повторный рендер не показывает обрезанных элементов.
|
||||
- На узкой ширине схема остаётся внутри контейнера. Её подробный смысл
|
||||
продублирован непустыми <code>alt</code> и <code>figcaption</code>;
|
||||
таблицы имеют существующий контейнер прокрутки
|
||||
<code>.table-scroll</code> в общих стилях.
|
||||
- После интеграции основной редактор повторно прогнал strict audit всех трёх
|
||||
slug и production build. Сборка прошла и сгенерировала 374 статические
|
||||
страницы.
|
||||
|
||||
## Реально выполненные проверки
|
||||
|
||||
1. <code>node --check web/scripts/upgrade-2018-07.mjs</code> — успешно.
|
||||
2. <code>node web/scripts/upgrade-2018-07.mjs --print-revisions</code> —
|
||||
успешно; в stdout выводится только JSON трёх ревизий, stderr пуст.
|
||||
3. Безопасный import выполнен отдельной командой; модуль экспортирует
|
||||
<code>revisions</code>, не печатает Usage и не меняет exit code.
|
||||
4. Структурная проверка экспортированных HTML подтвердила для всех трёх
|
||||
ревизий объём, число <code>h2</code>, figure, table, thead, code,
|
||||
нумерованный список, единый раздел источников, внешние ссылки и
|
||||
непустой alt.
|
||||
5. <code>xmllint --noout</code> для трёх SVG — успешно.
|
||||
6. Растровый рендер SVG через <code>sharp</code> проверен в исходном
|
||||
размере и на ширине 343 px; после исправления нет визуального выхода за
|
||||
canvas.
|
||||
7. <code>git status --short</code> по зоне задачи подтвердил, что до
|
||||
добавления этого ревью появились только четыре разрешённых июльских
|
||||
файла; <code>web/data/articles.json</code> и редакционные общие файлы
|
||||
этой партией не менялись.
|
||||
|
||||
Итоговый вердикт: пакет принят к публикации после независимого
|
||||
интеграционного ревью. Commit и push — отдельный выпускной шаг основного
|
||||
редактора.
|
||||
@@ -0,0 +1,130 @@
|
||||
# 2018-08 · TLS и CA bundle в PHP · тройное ревью
|
||||
|
||||
Статус: **принят в публикационный слой 31 июля 2026 года**. Пакет не
|
||||
перезаписывает `web/data/articles.json`: `web/data/editorial-revisions.mjs`
|
||||
накладывает его только по стабильным slug.
|
||||
|
||||
## Состав партии
|
||||
|
||||
| Ревизия | Основной текст | Смысловая задача | Визуал | Источники |
|
||||
| --- | ---: | --- | --- | ---: |
|
||||
| `editorial-2018-08-practice-tls-ca` | 7 816 знаков | Диагностика certificate verification в PHP cURL без снятия защиты | `tls-ca-diagnostic-2018.svg` | 8 |
|
||||
| `editorial-2018-08-mechanism-tls-ca` | 7 641 знак | Разделение server chain, CA store, hostname check и SNI | `tls-ca-chain-sni-2018.svg` | 7 |
|
||||
| `editorial-2018-08-field-tls-ca` | 8 358 знаков | Контролируемая замена устаревшего trust store | `tls-ca-refresh-plan-2018.svg` | 9 |
|
||||
|
||||
Во всех трёх ревизиях: 8–9 смысловых `<h2>` до раздела источников, одна
|
||||
доступная таблица с `<thead>` и `scope="col"`, один SVG с содержательным `alt`
|
||||
и `figcaption`, несколько примеров кода, нумерованный порядок действий,
|
||||
ограничения и точный заголовок `<h2>Проверяемые источники</h2>`.
|
||||
|
||||
## Проход 1 — факты и техника
|
||||
|
||||
### Что сверено
|
||||
|
||||
- [Документация cURL о CA certificates](https://curl.se/docs/sslcerts.html)
|
||||
подтверждает, что peer verification включена по умолчанию и custom CA store
|
||||
задаётся отдельно; ни одна статья не предлагает `CURLOPT_SSL_VERIFYPEER=false`
|
||||
как решение.
|
||||
- [Документация libcurl о CURLOPT_SSL_VERIFYPEER](https://curl.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html)
|
||||
и [CURLOPT_SSL_VERIFYHOST](https://curl.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html)
|
||||
использована для разделения проверки цепочки и имени хоста. В каждом PHP
|
||||
примере установлены `CURLOPT_SSL_VERIFYPEER => true` и
|
||||
`CURLOPT_SSL_VERIFYHOST => 2`.
|
||||
- [OpenSSL 1.0.2 s_client](https://docs.openssl.org/1.0.2/man1/s_client/)
|
||||
использован для фактов о `-servername`, `-showcerts`, `-CAfile` и `-CApath`.
|
||||
Текст прямо оговаривает, что `-showcerts` показывает присланный сервером
|
||||
список, а не уже проверенную цепочку.
|
||||
- [OpenSSL 1.0.2 verify](https://docs.openssl.org/1.0.2/man1/verify/)
|
||||
подтверждает различие `-CAfile` (trusted certificates) и `-untrusted`
|
||||
(intermediate certificates). Команда в статье разделяет leaf, intermediate
|
||||
и trust anchor, а не превращает intermediate в корневое доверие.
|
||||
- [PHP curl_version](https://www.php.net/manual/en/function.curl-version.php),
|
||||
[curl_error](https://www.php.net/manual/en/function.curl-error.php) и
|
||||
[cURL runtime configuration](https://www.php.net/manual/en/curl.configuration.php)
|
||||
сверены для диагностики PHP-модуля и абсолютного `curl.cainfo`.
|
||||
|
||||
### Технические решения ревью
|
||||
|
||||
- Команды используют `api.partner.example` как шаблон. В статьях нет
|
||||
выдуманного вывода `curl`, `s_client` или `openssl verify` и нет утверждения,
|
||||
что один код ошибки всегда означает единственную причину.
|
||||
- Код сохраняет `curl_errno()` и `curl_error()` до `curl_close()`, а verbose
|
||||
trace отмечен как материал закрытого стенда, не публичный лог.
|
||||
- В статье о механизме цепочка проверяется отдельно от HTTP и отдельно от
|
||||
hostname check. Это не смешивает SNI с проверкой имени.
|
||||
- В полевой статье новый bundle — версионный конфигурационный артефакт;
|
||||
кандидат проверяется до переключения, а final check выполняется тем же
|
||||
PHP-клиентом.
|
||||
|
||||
### Выполненные проверки
|
||||
|
||||
```text
|
||||
node --check web/scripts/upgrade-2018-08.mjs
|
||||
node web/scripts/upgrade-2018-08.mjs --print-revisions | JSON.parse(...)
|
||||
dynamic import: revisions export есть, process.exitCode не изменился
|
||||
структурная проверка: 3/3 ревизии, 5 000–15 000 знаков, h2/figure/table/code/ol/sources
|
||||
negative scan: нет CURLOPT_SSL_VERIFYPEER => false и VERIFYHOST => 0/1
|
||||
```
|
||||
|
||||
Вердикт прохода: **пройдено**. Версионная оговорка сохранена: формулировки
|
||||
ошибок и детали TLS backend зависят от связки PHP/libcurl/OpenSSL; инструкции
|
||||
собирают её версию до вывода.
|
||||
|
||||
## Проход 2 — редактура и голос
|
||||
|
||||
Период — М1, 2018: практик PHP-интеграций расширяет вертикаль от cURL-ошибки к
|
||||
серверной цепочке и конфигурации окружения. Словарь ограничен cURL, OpenSSL,
|
||||
CA bundle, SNI, hostname, intermediate и конкретными параметрами API. В текст
|
||||
не добавлены поздние рамки вроде SLO, Kubernetes, distributed tracing или
|
||||
организационной стратегии.
|
||||
|
||||
| Проверка | Результат |
|
||||
| --- | --- |
|
||||
| Симптом и цена ошибки в первых 1–2 предложениях | Есть во всех трёх статьях: ложное исправление создаёт риск принятия подменённого узла |
|
||||
| Один главный вопрос на текст | Диагностика / механизм / controlled refresh разделены, примеры не дублируют друг друга |
|
||||
| Прагматичный маршрут | Каждый раздел ведёт от наблюдения к проверке и действию; финал возвращает критерий готовности |
|
||||
| Объём без источников | 7 816 / 7 641 / 8 358, в диапазоне 5 000–15 000 |
|
||||
| Шаблонные вводные | Сканер не нашёл «В современном мире», «очень важно», «следует отметить», «просто нужно», «нужно понимать, что» |
|
||||
| Границы применимости | Явно названы частный CA, missing intermediate, неверное имя, дата/отзыв/политика и разные TLS backend |
|
||||
|
||||
Во время этой вычитки сокращены универсальные формулировки: вместо «обновите
|
||||
сертификат» указано, какой объект обновляется и чем он проверяется; вместо
|
||||
«TLS не работает» названы конкретные ветки — CAfile, server chain, SNI и
|
||||
hostname. Тон оставлен спокойным и предметным: «давайте разберём», «сначала
|
||||
проверяю», «не смешиваю причины».
|
||||
|
||||
Вердикт прохода: **пройдено**.
|
||||
|
||||
## Проход 3 — визуал и выпуск
|
||||
|
||||
### Визуал
|
||||
|
||||
- `xmllint --noout` успешно проверил все три SVG.
|
||||
- Каждая схема открыта в браузере при ширине 1 280 px. Видимые размеры страницы
|
||||
не выходили за viewport; у SVG есть `<title>`, `<desc>` и 20–26 текстовых
|
||||
узлов для пояснения собственной схемы.
|
||||
- После первого визуального просмотра исправлены переноса длинных названий в
|
||||
`tls-ca-diagnostic-2018.svg` и `tls-ca-refresh-plan-2018.svg`; во второй
|
||||
схеме сокращена подпись стрелки и перенесена строка, чтобы текст не заходил
|
||||
на соседний блок.
|
||||
- В HTML статей используются существующие обёртки
|
||||
`<div class="table-scroll">`: stylesheet блога даёт им горизонтальную
|
||||
прокрутку, а таблицам — `min-width`. Полный mobile-render статьи намеренно
|
||||
не запускался: по условиям пакета ревизии не добавлены в data archive. На
|
||||
уровне разметки каждая таблица подготовлена для этого стиля.
|
||||
|
||||
### Выпускной контракт
|
||||
|
||||
- Скрипт экспортирует ровно три объекта как `revisions`.
|
||||
- При `node web/scripts/upgrade-2018-08.mjs --print-revisions` stdout проходит
|
||||
JSON.parse и содержит только три заданных slug.
|
||||
- При import скрипт не печатает Usage и не меняет `process.exitCode`.
|
||||
- Новые файлы ограничены этим review, одним скриптом и тремя SVG; `articles.json`,
|
||||
стандарт, очередь, registry, audit-скрипт, Git index/commit/push не менялись.
|
||||
|
||||
Вердикт прохода: **принято к публикации**. Основной редактор повторно прогнал
|
||||
strict audit всех трёх slug и production build после интеграции: сборка прошла
|
||||
и сгенерировала 374 статические страницы. Повторный live mobile-render в этой
|
||||
среде заблокирован политикой браузера; для таблиц применён уже проверенный
|
||||
общий контракт `<div class="table-scroll">` + `min-width`, а отдельные SVG
|
||||
прошли XML и авторскую визуальную вычитку.
|
||||
Reference in New Issue
Block a user