fix(scripts): гейт называет, чей код он проверяет - #1528
Conversation
`pip install -e` ставит пакет из ОДНОГО клона на весь интерпретатор, поэтому в `git worktree` `import stepik_grader` ведёт обратно в основной клон. Тесты и скрипты при этом берутся из текущего дерева — и прогон честно отрабатывает гибрид «мои тесты против чужого кода», ничего об этом не сообщая. Оба исхода наблюдались за одну сессию. Ложно-зелёный: готовый фикс лежал в worktree, прогон показывал прежний вердикт — правка ядра не участвовала, и это читалось как «фикс не работает». Ложно-красный: ветка, правившая только `scripts/`, упала на чужом тесте, потому что основной клон стоял на третьей ветке с другим вердиктом. Проверенного состояния не существовало ни в одной ветке. Происхождение спрашивается у интерпретатора, а не собирается из корня: корень об установке не знает. Проверка идёт ПЕРВОЙ — остальные ответы имеют смысл только после неё. Заметка, а не отказ: worktree для `scripts/`, `tests/` и документации законен, а гейт, краснеющий на верном приёме, снимают первой же правкой. Правило уехало в контракт (§ Критические запреты) и предложением в общий каталог — тем же заходом, как требует CLAUDE.md. Closes #1521 Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wqpt9etxi7Hz6dNyhmYfx1
Конфликт в `.rules/proposals.json` разрешён сохранением ОБОИХ предложений: обе стороны добавляли по своему элементу в один массив — `gate-names-the-tree-it-checks` (эта ветка) и `experimental-is-a-claim-about-someone-elses-calendar` (#1529). Разные инциденты, разные слаги, ни одно не отменяет другое. Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wqpt9etxi7Hz6dNyhmYfx1
Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wqpt9etxi7Hz6dNyhmYfx1
|
Ставлю Что происходит. Здесь красна обязательная Почему это тупик без вмешательства. Голова очереди — этот PR, а из Что делает Обновить ветку отсюда нельзя: merge-коммит уехал бы от имени бота (CLAUDE.md § Гейты). Generated by Claude Code |
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com>
Переход #1420 доведён до конца. В обязательных проверках защиты `main` остаётся один `ci-complete`; четырнадцать прежних имён — джобы и ячейки матрицы — убраны из `EXPECTED_CHECKS`. ЗАЧЕМ. Имя ячейки несёт версию Python и флаг эксперимента, то есть меняется от ЧУЖОГО календаря. Выход 3.14 из предрелиза добавил сюда три строки (#1529), выход 3.15 добавил бы ещё три и убрал другие. Каждый такой сдвиг правится в ДВУХ местах сразу — в дереве и во внешней настройке репозитория, — а расходятся они молча: PR начинает ждать проверку, которой больше нет, и ни один прогон об этом не говорит. Ровно это правило 168 и не велит держать в обязательных. ЧТО НЕ ПОТЕРЯНО. Защита от переименования ячейки остаётся: состав выводит `ci_aggregate.expected_checks` из того же `ci.yml`, поэтому поймает её прогон, а не память. Предрелизные ячейки агрегатор отличает сам — по суффиксу `, true)`. ПОЧЕМУ СЕЙЧАС. Порядок перехода менять было нельзя, и он пройден целиком: агрегатор появился (#1456) → владелец добавил его в обязательные, ничего не убирая → PR мержились при нём. Последний шаг доказан на живых случаях, а не обещан: на #1537 и #1540 `ci-complete` зелёный при красных ячейках 3.15, на #1528 и #1530 — красный, потому что там красна обязательная (`windows-latest, 3.13` и `ubuntu-latest, 3.14`). То есть он и пропускает верное, и держит неверное. СМЕНИЛСЯ ПРЕДМЕТ ОДНОЙ ПРОВЕРКИ. `check_matrix_names` держала список в соответствии с матрицей, пока имена перечислялись. Теперь находкой считается ВОЗВРАЩЕНИЕ матричного имени в обязательные: это шаг назад, к состоянию, где каждый выпуск CPython правится дважды. ВЛАДЕЛЬЦУ: те же четырнадцать имён нужно убрать из ruleset, оставив `ci-complete`. Пока они там, ночная сверка назовёт расхождение — «обязательных проверок больше заявленного». Это и есть сигнал доделать, а не поломка гейта. Closes #1420 Claude-Session: https://claude.ai/code/session_01Wqpt9etxi7Hz6dNyhmYfx1 Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
pip install -eставит пакет из ОДНОГО клона на весь интерпретатор, поэтомув
git worktreeimport stepik_graderведёт обратно в основной клон. Тесты искрипты при этом берутся из текущего дерева — и прогон честно отрабатывает
гибрид «мои тесты против чужого кода», ничего об этом не сообщая.
Оба исхода наблюдались за одну сессию. Ложно-зелёный: готовый фикс лежал в
worktree, прогон показывал прежний вердикт — правка ядра не участвовала, и это
читалось как «фикс не работает». Ложно-красный: ветка, правившая только
scripts/, упала на чужом тесте, потому что основной клон стоял на третьейветке с другим вердиктом. Проверенного состояния не существовало ни в одной
ветке.
Происхождение спрашивается у интерпретатора, а не собирается из корня: корень
об установке не знает. Проверка идёт ПЕРВОЙ — остальные ответы имеют смысл
только после неё. Заметка, а не отказ: worktree для
scripts/,tests/идокументации законен, а гейт, краснеющий на верном приёме, снимают первой же
правкой.
Правило уехало в контракт (§ Критические запреты) и предложением в общий
каталог — тем же заходом, как требует CLAUDE.md.
Closes #1521
Работа сделана вместе: @ArtVsMark — постановка, решения и приёмка; Claude Code — реализация.