66 lines
7.3 KiB
Markdown
66 lines
7.3 KiB
Markdown
# Черновое тройное ревью — февраль 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` и все координаты элементов лежат внутри полотна.
|