Files
progcode/editorial/reviews/2024-08-draft.md
T
huncode 04dbb60f16
Build and deploy / deploy (push) Successful in 18s
revise August 2024 feature flag articles
2026-07-31 16:27:37 +03:00

101 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P78 — август 2024: feature flags — draft review
## Граница пакета
P78 заменяет только три августовских черновика через overlay `web/scripts/upgrade-2024-08.mjs`:
- `editorial-2024-08-practice-feature-flags` — «Фича-флаг как контракт выпуска: как не оставить переключатель навсегда»;
- `editorial-2024-08-mechanism-feature-flags` — «Где принимать решение флага: server, client и журнал exposure»;
- `editorial-2024-08-field-feature-flags` — «Выключить флаг — не значит удалить риск: rollout, rollback и cleanup».
Скрипт экспортирует только `revisions`; `web/data/articles.json` не менялся. В пакете нет registry, README, статуса, staged changes, commit или push. Фикстура работает только с versioned fixed synthetic objects в памяти: она не читает и не пишет flag store, файлы, сеть, часы, CI, telemetry, user data или production.
## Source report и историческая граница
| Источник | Закрепление и факт, используемый в тексте | Ограничение |
| --- | --- | --- |
| [OpenFeature Specification v0.6.0 release, 16.05.2023](https://github.com/open-feature/spec/releases/tag/v0.6.0) | Датированный versioned release, доступный к августу 2024; включает provider events, initialization и shutdown. | Не доказывает одинаковую реализацию provider и не задаёт exactly-once для какого-либо события. |
| [OpenFeature v0.6.0 — Flag Evaluation API](https://github.com/open-feature/spec/blob/v0.6.0/specification/sections/01-flag-evaluation.md) | Раздел versioned release: typed evaluation с flag key, default value и optional evaluation context; abnormal execution возвращает default. | API-контракт, не policy TTL, секретов, rollout или удаления флага. |
| [OpenFeature v0.6.0 — Evaluation Context](https://github.com/open-feature/spec/blob/v0.6.0/specification/sections/03-evaluation-context.md) | Раздел versioned release: targeting key идентифицирует subject, а context имеет определённый merge order. | Раздел experimental; не обещает distributed snapshot или непрерывную консистентность когорты. |
| [OpenFeature v0.6.0 — Events](https://github.com/open-feature/spec/blob/v0.6.0/specification/sections/05-events.md) | Раздел versioned release: provider readiness, error, configuration changed и stale events. | Раздел experimental; это не бизнес-exposure и не delivery contract. |
| [Unleash Feature Toggles — immutable commit `341703978af887a364a9d872d9e3a906ae4dbbcb`, 21.08.2024](https://github.com/Unleash/unleash/blob/341703978af887a364a9d872d9e3a906ae4dbbcb/website/docs/reference/feature-toggles.mdx) | Неизменяемый первичный Git-снимок в пределах августа 2024: type и description, activation strategies по environment, disabled toggle evaluates false. | Не задаёт owner, expiry, наблюдение, метрики или cleanup process произвольной команды. |
| [Unleash Front-end API — immutable commit `4ae65d6d5e095d5c056ae63c60afcb09dd6cfe5b`, 24.05.2024](https://github.com/Unleash/unleash/blob/4ae65d6d5e095d5c056ae63c60afcb09dd6cfe5b/website/docs/reference/front-end-api.md) | Неизменяемый первичный Git-снимок до августа 2024: Front-end API, FRONTEND token, CORS и refresh interval с random offset для Unleash 4.18+. | Не является переносимой гарантией момента refresh, client-side evaluation или единой конфигурации у всех клиентов. |
Исторические меняющиеся документы закреплены либо датированным релизом `v0.6.0`, либо точным immutable Git commit. Архивные URL и старый домен документации Unleash из P78 удалены.
### Обязательная проверка ссылок
Перед выпуском выполнен обычный HTTPS GET для всех шести URL выше:
```sh
curl -L --fail --silent --show-error --output /dev/null \
--write-out '%{http_code} %{url_effective}\n' URL
```
Команда запускалась без `-k`/`--insecure`, без TLS bypass, без заголовка авторизации, credentials или cookie jar. Результат для каждого URL — `200`; redirect ведёт на тот же публичный GitHub URL. Проверка выполнена 31.07.2026 для доступа к закреплённым историческим источникам, а не как утверждение об их текущем содержимом.
## Проход 1 — факты и техника
- У каждого материала первые два абзаца называют проблему и цену: долговая ветвистость release-флага; неясный authoritative evaluator и лишний context; false/100% без удаления runtime dependency.
- Цепочка в текстах одинаковая и проверяемая: «симптом → причина → проверка → действие». Это не рекламный нарратив и не runbook, притворяющийся production-инструментом.
- В mechanism-материале строго разделены evaluation, exposure candidate, render confirmation и domain effect. Provider events OpenFeature не выданы за бизнес-события. Ни одна статья не обещает exactly-once; при необходимости назван idempotency key на стороне потребителя.
- В practice-материале owner, expiry и deletion path честно названы командной policy, а не возможностью OpenFeature или Unleash.
- В field-материале 0/5/25/100, сигналы и сценарии — `fixed synthetic model`. Это не трафик, SLO, incident, пользовательские данные, интервью или production-метрики.
- Фикстура принимает только канонический fixed synthetic input. Она отвергает unknown keys, file/network/clock/telemetry/production markers, неверную версию и scope, разрежённые массивы, подменённые карточки/решения, циклический input/report и forged cleanup draft. Отдельная проверка доказывает, что некорректный input не меняет frozen fixed record.
## Проход 2 — редактирование и голос
Автор августа 2024 — системный практик: короткие технические абзацы, конкретный контекст и явная граница вывода. В каждом тексте есть постановка проблемы в первых двух абзацах, таблица решения, компактный воспроизводимый код или конфиг, ограничения и один следующий проверяемый шаг.
| Slug | Основное тело | Редакторский контроль |
| --- | ---: | --- |
| `editorial-2024-08-practice-feature-flags` | 9 586 знаков | Контракт флага проходит от owner и audience к наблюдению и removal; сигнал не назван доказательством эффекта. |
| `editorial-2024-08-mechanism-feature-flags` | 11 878 знаков | Граница server/client, cohort key и event semantics разобраны без магических гарантий provider. |
| `editorial-2024-08-field-feature-flags` | 12 045 знаков | Rollout, rollback и cleanup разведены; 100% и disabled явно не названы завершением удаления. |
Диапазон 5 000–15 000 знаков соблюдён для всех трёх тел. Английские термины оставлены только там, где они обозначают API, контракт или артефакт; рядом дано техническое значение, а не рекламная формулировка.
## Проход 3 — визуал и выпуск
Три SVG нарисованы вручную; в них нет `<script>`, `<foreignObject>`, `javascript:`, `data:image` или event handlers. После первого Sharp-render на 375 px длинные подписи cleanup/delivery были разбиты на короткие строки; затем сделан повторный визуальный просмотр всех трёх мобильных PNG.
| Артефакт | Смысл | Sharp-render на ширине 375 px |
| --- | --- | --- |
| `feature-flags-2024-decision-tree.svg` | Карточка контракта, граница решения, наблюдение и cleanup path. | `375×552` |
| `feature-flags-2024-rollout-timeline.svg` | Server/client decision flow и пунктирная граница delivery. | `375×510` |
| `feature-flags-2024-cleanup-gate.svg` | Synthetic rollout, rollback и отдельный cleanup gate. | `375×573` |
Выполненные команды и результаты:
```text
node --check web/scripts/upgrade-2024-08.mjs
exit 0
node web/scripts/upgrade-2024-08.mjs --verify-fixture
PASS fixture: 35/35 assertions
(cd web && npm run audit:draft -- scripts/upgrade-2024-08.mjs)
PASS editorial-2024-08-practice-feature-flags: 9586 body chars
PASS editorial-2024-08-mechanism-feature-flags: 11878 body chars
PASS editorial-2024-08-field-feature-flags: 12045 body chars
xmllint --noout <three P78 SVG files>
exit 0
rg -n -i '<(script|foreignObject)\\b|javascript:|data:image|[[:space:]]on[a-z]+[[:space:]]*=' <three P78 SVG files>
exit 1, no matches (expected clean result)
Sharp render of all three SVG files at width 375
exit 0; 375×552, 375×510, 375×573
```
Полная база не собиралась: это явно оставлено главному агенту после интеграции. P78 не staged, не committed и не pushed.
## Выпуск после трёх независимых проходов
1. **Факты и техника.** Редактор повторно сверил OpenFeature v0.6.0 release и raw tagged specification: typed evaluation, optional context, default value при abnormal execution, experimental context/events и их границы совпадают с текстом. Два Unleash immutable commits подтвердили environment strategies, false для disabled toggle, Front-end API, FRONTEND token, CORS и refresh с random offset. `node --check` и fixture — **PASS 35/35**.
2. **Редактура и голос.** В публичном field-материале служебное имя партии `P78` заменено на «учебная фикстура». Остальные три текста проверены на разные задачи: release contract, server/client boundary и cleanup. Объёмы после вычитки — **9 586**, **11 878**, **12 049** знаков; каждое решение начинает с наблюдаемой цены и заканчивается проверяемым действием.
3. **Визуал и выпуск.** Три SVG прошли XML/safety scan, повторный Sharp-render и ручной просмотр на 375 px: decision tree, delivery boundary и cleanup gate остаются читаемыми. После календарного подключения перед сентябрём `audit:articles` подтвердил для каждого slug 1 figure, 2 table и 1 code example; registry содержит **232** уникальные ревизии. `npm run build` завершился успешно: **374** статические страницы.
В выпуск включаются только пять файлов августа, обновления registry/production README и эта приёмка. Пользовательские изменения, черновики октября/ноября и исходный `articles.json` исключены.