Files
progcode/editorial/reviews/2024-01-draft.md
T
huncode e74907ff32
Build and deploy / deploy (push) Successful in 15s
revise January 2024 legacy modernization articles
2026-07-31 15:28:25 +03:00

12 KiB
Raw Blame History

П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. Использован только для исторического вывода о сложности и риске большого cut-over и ценности постепенного вытеснения. Страница прямо называет этот текст оригинальной версией; более поздние материалы со страницы не используются как знания автора января 2024.
    • OpenAPI Specification v3.1.0, 15.02.2021. Использована для утверждений о language-agnostic HTTP interface, paths, operations и Schema Object. Документ не превращён в доказательство business semantics, side effect, temporal rule или runtime parity.
    • Google SRE Workbook, Canarying Releases, copyright 2018. Использован для определения 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 статические страницы.