# П71 · 2024-01 · Модернизация legacy-системы без потери поведения — три прохода саморевью ## Граница sidecar-партии - Slug: editorial-2024-01-practice-legacy-modernization, editorial-2024-01-mechanism-legacy-modernization, editorial-2024-01-field-legacy-modernization. - Голос: М7. Автор уже связывает локальный API/интеграционный опыт с ценой решения для команды: scope, owner, compatibility, rollout и rollback. Тон остаётся прагматичным: наблюдаемый симптом, причина, проверка, действие и граница вывода. Нет фиктивной production-истории, универсальных процентов rollout или обещания, что переписывание всегда безопасно. - Созданы только этот review, один import-safe script и три локальных SVG. Не менялись articles.json, registry, README, очередь, Git и любые чужие пути. Партия не интегрирована. - Fixture создаёт только фиксированные, явно помеченные synthetic JS-records в памяти. Он не читает legacy code/history, файлы, базу или переменные окружения; не запускает parity tests, CI, сеть или HTTP; не измеряет coverage/performance; не получает пользователей, трафик, ответы или deployment history. PASS не заявляет, что реальное legacy-поведение сохранено, parity прошёл или rollout/rollback выполнен. ## Проход 1 — факты и техника - Исторические источники перепроверены 31.07.2026 и ограничены тем, что существовало к концу января 2024: - [Martin Fowler, Original Strangler Fig Application, 29.06.2004](https://martinfowler.com/bliki/OriginalStranglerFigApplication.html). Использован только для исторического вывода о сложности и риске большого cut-over и ценности постепенного вытеснения. Страница прямо называет этот текст оригинальной версией; более поздние материалы со страницы не используются как знания автора января 2024. - [OpenAPI Specification v3.1.0, 15.02.2021](https://spec.openapis.org/oas/v3.1.0.html). Использована для утверждений о language-agnostic HTTP interface, paths, operations и Schema Object. Документ не превращён в доказательство business semantics, side effect, temporal rule или runtime parity. - [Google SRE Workbook, Canarying Releases, copyright 2018](https://sre.google/workbook/canarying-releases/). Использован для определения canary как частичного ограниченного по времени развёртывания с оценкой, требования сравнить canary/control и оговорки о synthetic load. Глава не перенесена в текст как готовый процент traffic, наблюдаемость, alert policy или release authority чужой команды. - Три статьи отвечают на разные вопросы. Practice выбирает измеримый шов и стоимость временного сосуществования. Mechanism отделяет schema от transport/payload/effect/time compatibility. Field раскладывает rollout на manual gates и отделяет возврат route от data recovery. - createSyntheticModernizationPlan() принимает только один фиксированный synthetic seam, три rules, три cases, три ordered stages, named owner и proposal вернуть legacy-only route. Поля для network, real result, coverage, whole-system rewrite, unknown owner, automatic release, перестановки stages и destructive rollback отклоняются до формирования plan. - На техническом проходе найден риск ложного rollback: ранее функция могла принять произвольно собранный объект с accepted=true и пустым snapshot. Добавлена isSyntheticSnapshot() и отрицательная ветка rejectsFabricatedSnapshot. Независимое review добавило ещё одну защиту: snapshot с верной длиной nested arrays, но без фиксированных records, тоже отклоняется. Теперь rollback возвращает только snapshot plan с точным seam, compatibility rules/cases, ordered stages и rollback contract; он не выполняет route/data action. - У результата явно сохранены отрицательные заявления: realLegacyBehavior=not-read-or-claimed, parity=not-run-or-claimed, realRollout=not-attempted, releaseAuthority=not-granted, coverage=not-measured и performance=not-measured. Это не операционный runbook и не тест production-поведения. ## Проход 2 — редактура, объём и голос - Каждый текст начинается с конкретной цены ошибки: большой rewrite скрывает правила до cut-over; похожий JSON скрывает semantic/effect mismatch; процент rollout без control и data boundary расширяет blast radius. - В каждой ревизии есть таблица, самостоятельный SVG с содержательными alt и подписью, executable synthetic fixture, нумерованный маршрут «симптом → причина → проверка → действие», limits, rollback boundary и следующий шаг. - Автоматический аудит подтвердил основной объём без metadata и списка источников: practice — 10 713, mechanism — 10 857, field — 10 509 знаков. Все три статьи лежат в требуемом диапазоне П71 9–11 тыс. и общем диапазоне 5–15 тыс. знаков. - Техническая речь оставлена короткой и привязанной к артефакту: seam означает один request/response contract; parity — выбранные invariants; gate — один вопрос и owner; rollback-route не выдается за data recovery. Общие оценки заменены условиями, evidence и действием. - M7 не подменяет траекторию автора скачком в абстрактную стратегию. Мост к новой компетенции — ранние материалы о Bitrix/legacy-гранях, API contracts, delivery и наблюдаемости. В январе 2024 автор ещё не заявляет платформенный масштаб, а помогает команде сделать минимальный проверяемый шаг и увидеть стоимость неясности. ## Проход 3 — визуал, безопасность и выпуск - legacy-modernization-2024-strangler-map.svg показывает один request-level seam, router decision, legacy/new adapters, owner и вынесенные за границу data/effects. - legacy-modernization-2024-compatibility-matrix.svg разделяет valid/invalid/repeat и transport/payload/effect/time. Unknown остаётся отдельным результатом, а не декоративной зелёной отметкой. - legacy-modernization-2024-rollout-gate.svg показывает manual stages, comparison evidence, return route и отдельную красную границу data recovery/provider effect. - После первого Sharp-review заголовок матрицы не помещался на ширине 375 px. Он сокращён до «Parity: свойства важнее похожего JSON»; финальный рендер читаем без обрезания. В остальных двух схемах проверены стрелки, подписи, границы и отсутствие перекрытий. - SVG не содержит script, foreignObject, внешних URL, javascript:, data:image или event-handler attributes. В каждом есть title, desc, role=img и корректный viewBox. - Выполнены: node --check web/scripts/upgrade-2024-01.mjs — PASS; fixture — PASS 26/26 после независимого model review; cd web && npm run audit:draft -- scripts/upgrade-2024-01.mjs — PASS для трёх slug; import-safe export без date/author — PASS через audit; xmllint --noout — PASS; SVG safety scan — чисто; Sharp 375 px — PASS. - Не запускались production build, registry integration, Git commit и push: это за пределами sidecar-ограничения и будет отдельной приёмкой. ## Интеграционное ревью главного агента Проверены первичные источники. Original Strangler Fig Application описывает риск big cut-over и постепенное вытеснение; OAS 3.1.0 от 15 февраля 2021 определяет language-agnostic HTTP interface; Google SRE Workbook связывает canary с сопоставлением control/canary и отдельно ограничивает synthetic load как неполное представление state coverage. Эти факты используются как рамка, не как доказательство эффективности конкретной миграции. Model review обнаружил, что `isSyntheticSnapshot()` проверял длины вложенных arrays, но не их exact records. Snapshot теперь сохраняет полный contract и rollout shape, а его проверка вызывает строгие validators seam/rules/cases/ stages/rollback. Добавлена ветка с тремя пустыми records каждой коллекции; она отвергается. Fixture проходит `26/26` assertions. Все SVG прошли XML и safety scan, затем вручную проверены после Sharp-render на 375 px. Повторный draft audit: 10 755 / 10 857 / 10 509 знаков. Строгий archive audit прошёл для трёх slug; registry содержит 208 уникальных ревизий. `npm run build` успешно сгенерировал 374 статические страницы.