# Черновое тройное ревью — февраль 2018 Партия не интегрирована в `web/data/articles.json`. Ревизии доступны только через: ```bash node web/scripts/upgrade-2018-02.mjs --print-revisions ``` ## 1. Факты и техника | Слаг | Главный вопрос | Проверенные первичные источники | Результат | | --- | --- | --- | --- | | `editorial-2018-02-practice-php-diagnostics` | Как оставить диагностический факт при 500 и фатальной ошибке PHP? | [set_error_handler](https://www.php.net/manual/en/function.set-error-handler.php), [set_exception_handler](https://www.php.net/manual/en/function.set-exception-handler.php), [register_shutdown_function](https://www.php.net/manual/en/function.register-shutdown-function.php), [error_get_last](https://www.php.net/manual/en/function.error-get-last.php) | Пример не обещает перехватить ошибки до регистрации обработчиков; отдельно названы ограничения фатального пути. | | `editorial-2018-02-mechanism-php-diagnostics` | Почему строка от `curl_exec()` не означает успех API-операции? | [curl_exec](https://www.php.net/manual/en/function.curl-exec.php), [curl_getinfo](https://www.php.net/manual/en/function.curl-getinfo.php), [curl_errno](https://www.php.net/manual/en/function.curl-errno.php), [RFC 7231](https://www.rfc-editor.org/rfc/rfc7231#section-6) | Строго разделены ошибка cURL, HTTP-статус и контракт тела; повтор записи не рекомендован без идемпотентности. | | `editorial-2018-02-field-php-diagnostics` | Как отделить битый JSON от корректного `null`? | [json_decode](https://www.php.net/manual/en/function.json-decode.php), [json_last_error](https://www.php.net/manual/en/function.json-last-error.php), [RFC 8259](https://www.rfc-editor.org/rfc/rfc8259.html) | Используется подход PHP 7.1; отмечено, что `JSON_THROW_ON_ERROR` появился только в PHP 7.3. | Проверено вручную: - В каждой статье не меньше двух официальных или первичных источников. - Утверждение о статусах HTTP ограничено протокольным уровнем; успех бизнес-операции проверяется проектным контрактом. - В журналы не предлагается писать пароли, токены, исходное тело запроса или полный ответ партнёра. - У примеров есть версия и границы: PHP 7.1, проектные таймауты, отсутствие универсального retry. ## 2. Редактура и голос | Слаг | Проблема в начале | Техническая речь и тон 2018 | Объём основного текста | | --- | --- | --- | --- | | `editorial-2018-02-practice-php-diagnostics` | Ответ 500 без причины в журнале | Короткая практическая заметка: контекст, этап, обработчик, проверка | Проверяется скриптом, диапазон 5 000–15 000 знаков | | `editorial-2018-02-mechanism-php-diagnostics` | Строка от cURL ошибочно объявляется успешной интеграцией | Симптом → уровень сбоя → запись в журнал → действие | Проверяется скриптом, диапазон 5 000–15 000 знаков | | `editorial-2018-02-field-php-diagnostics` | `if (!$data)` склеивает несколько разных состояний | Один вопрос о JSON, затем конкретные значения и контракт | Проверяется скриптом, диапазон 5 000–15 000 знаков | Проверено вручную: - У каждой статьи один главный вопрос; темы не копируют друг друга: runtime PHP, transport/HTTP и payload JSON. - Изъяты общие вводные о «важности» и обещания универсального решения. - Использованы проектные оговорки вместо выдуманных цифр, версий партнёрских API или результатов замеров. - Статьи заканчиваются действиями и ограничениями до списка источников. ## 3. Визуал и выпуск | Материал | Назначение | Проверка | | --- | --- | --- | | `php-fatal-context-flow.svg` | Показывает три ветки диагностики PHP и общий контекст операции | SVG содержит `title`, `desc`, осмысленный `alt` и подпись в статье | | `curl-outcome-classifier.svg` | Разделяет транспорт, HTTP и контракт тела | SVG содержит `title`, `desc`, осмысленный `alt` и подпись в статье | | `json-payload-diagnostic.svg` | Разделяет ошибку декодера и нарушение JSON-контракта | SVG содержит `title`, `desc`, осмысленный `alt` и подпись в статье | Проверки к запуску перед интеграцией: ```bash node --check web/scripts/upgrade-2018-02.mjs node web/scripts/upgrade-2018-02.mjs --print-revisions | jq 'length' xmllint --noout web/public/assets/editorial/2018/php-fatal-context-flow.svg xmllint --noout web/public/assets/editorial/2018/curl-outcome-classifier.svg xmllint --noout web/public/assets/editorial/2018/json-payload-diagnostic.svg ``` После интеграции основной агент должен запустить общий audit-скрипт и production-сборку. Этот авторский черновик их намеренно не запускает: он не меняет архив. ### Результаты авторского прохода - `node --check web/scripts/upgrade-2018-02.mjs` — PASS. - `node web/scripts/upgrade-2018-02.mjs --print-revisions` вернул массив из трёх ревизий; встроенная проверка структуры прошла. - Длина основного текста без источников: 7 109, 6 519 и 6 706 знаков соответственно; все значения в диапазоне 5 000–15 000. - `xmllint --noout` для трёх SVG — PASS. - Локальная браузерная отрисовка SVG заблокирована политикой среды, поэтому финальный просмотр на desktop и узком экране остаётся выпускной проверкой после интеграции в страницу. Структурная проверка выполнена: у каждого SVG единый `viewBox 1200×620`, описание `title`/`desc` и все координаты элементов лежат внутри полотна.