Stevens / Ivan Issue Report

PR #832 — итоговая позиция

PR: https://bitbucket.org/stevens_edu/stevens_main_nextjs/pull-requests/832 Задача: IX-SIT60 — Add schema for pages Статус: OPEN (на момент скринов, ~2026-04-24, Vercel last deploy) Цикл: 2026-02-21 → 2026-04-24+ = 2+ месяца Объём: ≥27 коммитов в 9+ батчах апдейтов REQUESTED CHANGES: да (Michael Forbes, 31.03)

🚨 Это самый проблемный PR из разобранных

PR #832 концентрирует все 4 пункта письма Alexis в одном артефакте:

Претензия письма (29.04)Прямое доказательство в PR #832
deviate considerably from specComment #1 (Minisite Right Nav пропущен), Comment #4 (invalid VideoObject — повторение ошибки из PR #842), Comment #6 (undefined base URL в проде), Comment #7 (hardcoded /news/ вместо getExternalPath), Comment #8/9 (hardcoded creditText в 2 местах)
PRs require post-deployment tasks accompanied by suchComment #2: Alexis ещё 23 февраля прямо спрашивал про pre-deployment steps. То есть проблема была озвучена за 2 месяца до письма и не решена системно.
internal validation pass prior to sendingВсе 9+ замечаний — это то, что должен ловить self-review / lint / тимлид-проверка перед отправкой ревьюерам. Особенно undefined URL, который уже виден на проде (preview).
smaller batches, reduce TTM2+ месяца, ≥27 коммитов в одном PR, REQUESTED CHANGES, ~9 батчей апдейтов

Сводка по комментариям

#АвторСерьёзностьТемаОбоснованно
1Bemin🟡Minisite Right Nav pages не включены✅ Да
2Alexis🚨Hold + прямой запрос pre-deployment steps✅ Да — прямой эхо письма за 2 мес
3Bemin🟡Contact pages PostalAddress в rich textObservation/блокер модели
4Michael🚨Invalid VideoJsonLd для hero (REQUESTED CHANGES)✅ Да — повторение ошибки PR #842
5Michael🟡Whitespace-only изменения, конфликт с другим PR✅ Да
6Bemin🚨undefined base URL → "url":"undefined/profile/..." на проде✅ Да — функциональный баг
7Bemin🟡Hardcoded /news/ префикс вместо getExternalPath✅ Да
8Bemin🟡Hardcoded creditText (events)✅ Да
9Bemin🟡Hardcoded creditText (program)✅ Да — повтор ошибки внутри PR

Всего: 9 значимых замечаний, 8 из 9 обоснованы, 3 — критичные (включая REQUESTED CHANGES).

🚨 Критичные открытия

1. Alexis сигнализировал про pre-deployment steps уже 23 февраля (Comment #2)

Письмо от 29.04 — это не первый сигнал. Alexis в PR #832 2 месяца назад прямо спрашивал Ивана и Антона Москаленко (наш тимлид): "are there any additional steps we need to take prior to deployment? This would include any changes to Contentful fields and the like." Иван ответил "no additional steps". Это значит:

  • Проблема была явно поднята.
  • Тимлид Антон был тегнут и в курсе.
  • Несмотря на это, в PR #842 (~5 недель спустя) ситуация повторилась — pre-merge tasks снова не были описаны, у Michael сломался build.

Это ключевой тезис для встречи: мы не можем говорить "только что узнали из письма". Это уже звучало.

2. Повторяющаяся ошибка про invalid VideoObject (Comment #4)

В PR #842 Comment #3 Michael ловил это: VideoObject без uploadDate невалиден. В PR #832 Comment #4 (хронологически — раньше, в PR #832 31.03; PR #842 ту же ошибку 31.03 тоже) тот же Michael ловит ту же ошибку в коде Ивана. Это паттерн, не случайность — Иван не усвоил это требование между PR.

3. Undefined URL уже на production preview (Comment #6)

"url":"undefined/profile/fkim" — Bemin видел на проде (preview). Это значит:

  • Тестирования / self-review реально не было.
  • Поломанная функциональность дошла до этапа ревью клиентом.

4. Использование существующих абстракций

Comment #7, #8, #9 — Иван не использует getExternalPath и Image Wrapper.credit field, хотя они уже есть в codebase. Это вопрос знания проекта и внимательности к существующим решениям.

5. Огромный размер и длительность PR

2+ месяца, ≥27 коммитов, ≥9 батчей апдейтов — это ровно то, против чего Alexis высказался в письме ("smaller batches, smaller incremental releases").

Что в нашу пользу

  • Иван реагирует на каждое замечание. На все комментарии есть исправляющие коммиты.
  • PR не заброшен — постоянная активность.
  • На большинство стилистических/процессных замечаний (whitespace, hardcode) Иван не возражает, исправляет.

Однако этих смягчающих обстоятельств намного меньше, чем в PR #837 (где код "looks great") или PR #842.

Корневые причины

  1. Отсутствие self-review дисциплины — undefined URL, debug-код, hardcoded строки, лишние whitespace-изменения — это всё ловится за 5-15 минут перед открытием PR.
  2. Слабое знание codebasegetExternalPath, Image Wrapper.credit уже есть, но Иван их не использовал.
  3. Невыученные уроки между PR — invalid VideoObject повторился из PR #842 в #832.
  4. Отсутствие internal validation pass — большинство багов должно ловиться нашей стороной до отправки на ревью.
  5. Слишком крупный батч работы — 27+ коммитов в одном PR, охват слишком широкий, цикл ревью затянулся.
  6. Сигналы клиента игнорировались системно — Alexis уже 23.02 прямо спросил про pre-deployment steps; в PR #842 эта проблема повторилась.

Действия / план до встречи

  • Найти "schema templates doc" — где лежит спека по всем типам страниц? В Jira (как ICUS-214 для FAQ)? Параллельный документ?
  • Уточнить у Ивана:
    • Видел ли schema templates doc до старта работы по IX-SIT60?
    • Почему ответил "no additional steps required" Alexis 24.02 — была ли действительно проверка?
    • Почему не использовал getExternalPath / credit field — не знал об их существовании или забыл?
    • Почему повторил ошибку invalid VideoObject из PR #842?
  • Уточнить у Антона:
    • Был ли он в курсе сигнала Alexis 23.02 про pre-deployment? Что было сделано после?
    • Делается ли self-review / internal validation pass на нашей стороне?
    • Почему такой большой PR (2+ месяца, 27+ коммитов) — была ли возможность разбить?

Ключевой вывод

PR #832 — это документально подтверждённая иллюстрация того, что:

  1. Проблемы, на которые жалуется Alexis в письме, — не новые. Они звучали явно ещё в феврале.
  2. Эти проблемы системные (повторяются между PR), не разовые.
  3. На стороне нашей команды (Иван + Антон) не было структурного ответа на ранние сигналы.

Для встречи: на базе этого PR честная позиция — признать, что мы пропустили ранние сигналы и не отстроили процессы. Дальнейший разговор должен быть не о защите, а о конкретном плане, как это исправить (PR template, self-review checklist, разбиение работы, internal validation pass — и кто за это отвечает).

В разговоре с клиентом этот PR лучше не выводить как пример — он играет против нас сильнее всех остальных. Использовать его внутри нашей команды как материал для разговора с Антоном/Иваном.