This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
# 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` исключены.
|
||||
Reference in New Issue
Block a user