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 spec | Comment #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 such | Comment #2: Alexis ещё 23 февраля прямо спрашивал про pre-deployment steps. То есть проблема была озвучена за 2 месяца до письма и не решена системно. |
| internal validation pass prior to sending | Все 9+ замечаний — это то, что должен ловить self-review / lint / тимлид-проверка перед отправкой ревьюерам. Особенно undefined URL, который уже виден на проде (preview). |
| smaller batches, reduce TTM | 2+ месяца, ≥27 коммитов в одном PR, REQUESTED CHANGES, ~9 батчей апдейтов |
Сводка по комментариям
| # | Автор | Серьёзность | Тема | Обоснованно |
|---|---|---|---|---|
| 1 | Bemin | 🟡 | Minisite Right Nav pages не включены | ✅ Да |
| 2 | Alexis | 🚨 | Hold + прямой запрос pre-deployment steps | ✅ Да — прямой эхо письма за 2 мес |
| 3 | Bemin | 🟡 | Contact pages PostalAddress в rich text | Observation/блокер модели |
| 4 | Michael | 🚨 | Invalid VideoJsonLd для hero (REQUESTED CHANGES) | ✅ Да — повторение ошибки PR #842 |
| 5 | Michael | 🟡 | Whitespace-only изменения, конфликт с другим PR | ✅ Да |
| 6 | Bemin | 🚨 | undefined base URL → "url":"undefined/profile/..." на проде | ✅ Да — функциональный баг |
| 7 | Bemin | 🟡 | Hardcoded /news/ префикс вместо getExternalPath | ✅ Да |
| 8 | Bemin | 🟡 | Hardcoded creditText (events) | ✅ Да |
| 9 | Bemin | 🟡 | 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.
Корневые причины
- Отсутствие self-review дисциплины — undefined URL, debug-код, hardcoded строки, лишние whitespace-изменения — это всё ловится за 5-15 минут перед открытием PR.
- Слабое знание codebase —
getExternalPath,Image Wrapper.creditуже есть, но Иван их не использовал. - Невыученные уроки между PR — invalid VideoObject повторился из PR #842 в #832.
- Отсутствие internal validation pass — большинство багов должно ловиться нашей стороной до отправки на ревью.
- Слишком крупный батч работы — 27+ коммитов в одном PR, охват слишком широкий, цикл ревью затянулся.
- Сигналы клиента игнорировались системно — 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/creditfield — не знал об их существовании или забыл? - Почему повторил ошибку invalid VideoObject из PR #842?
- Уточнить у Антона:
- Был ли он в курсе сигнала Alexis 23.02 про pre-deployment? Что было сделано после?
- Делается ли self-review / internal validation pass на нашей стороне?
- Почему такой большой PR (2+ месяца, 27+ коммитов) — была ли возможность разбить?
Ключевой вывод
PR #832 — это документально подтверждённая иллюстрация того, что:
- Проблемы, на которые жалуется Alexis в письме, — не новые. Они звучали явно ещё в феврале.
- Эти проблемы системные (повторяются между PR), не разовые.
- На стороне нашей команды (Иван + Антон) не было структурного ответа на ранние сигналы.
Для встречи: на базе этого PR честная позиция — признать, что мы пропустили ранние сигналы и не отстроили процессы. Дальнейший разговор должен быть не о защите, а о конкретном плане, как это исправить (PR template, self-review checklist, разбиение работы, internal validation pass — и кто за это отвечает).
В разговоре с клиентом этот PR лучше не выводить как пример — он играет против нас сильнее всех остальных. Использовать его внутри нашей команды как материал для разговора с Антоном/Иваном.