Skip to content

fix(scripts): гейт называет, чей код он проверяет - #1528

Merged
ArtVsMark merged 5 commits into
mainfrom
agent/gate-says-where-the-package-came-from
Oct 1, 2026
Merged

ArtVsMark merged 5 commits into
mainfrom
agent/gate-says-where-the-package-came-from

Conversation

@ArtVsMark

Copy link
Copy Markdown
Owner

pip install -e ставит пакет из ОДНОГО клона на весь интерпретатор, поэтому
в git worktree import stepik_grader ведёт обратно в основной клон. Тесты и
скрипты при этом берутся из текущего дерева — и прогон честно отрабатывает
гибрид «мои тесты против чужого кода», ничего об этом не сообщая.

Оба исхода наблюдались за одну сессию. Ложно-зелёный: готовый фикс лежал в
worktree, прогон показывал прежний вердикт — правка ядра не участвовала, и это
читалось как «фикс не работает». Ложно-красный: ветка, правившая только
scripts/, упала на чужом тесте, потому что основной клон стоял на третьей
ветке с другим вердиктом. Проверенного состояния не существовало ни в одной
ветке.

Происхождение спрашивается у интерпретатора, а не собирается из корня: корень
об установке не знает. Проверка идёт ПЕРВОЙ — остальные ответы имеют смысл
только после неё. Заметка, а не отказ: worktree для scripts/, tests/ и
документации законен, а гейт, краснеющий на верном приёме, снимают первой же
правкой.

Правило уехало в контракт (§ Критические запреты) и предложением в общий
каталог — тем же заходом, как требует CLAUDE.md.

Closes #1521

Работа сделана вместе: @ArtVsMark — постановка, решения и приёмка; Claude Code — реализация.

`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
@ArtVsMark ArtVsMark added the merge-when-green Согласие смержить без автора: авто-мерж включится, как позеленеет label Sep 9, 2026
@ArtVsMark
ArtVsMark enabled auto-merge (squash) September 9, 2026 05:49
@claude claude Bot added area/ci CI/CD и скрипты (.github/, scripts/) tech-debt labels Sep 9, 2026
@ArtVsMark ArtVsMark added the needs-rebase Конфликт с main: очередь пропускает, нужно ручное слияние label Sep 9, 2026
claude and others added 2 commits September 9, 2026 10:39
Конфликт в `.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
@claude claude Bot removed the needs-rebase Конфликт с main: очередь пропускает, нужно ручное слияние label Sep 9, 2026
@claude

claude Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Ставлю hold — временно и по делу, а не потому что PR плох.

Что происходит. Здесь красна обязательная test (windows-latest, 3.13, false). Это известный флейк SQLite на Windows, и починен он в #1540 (fix(glossary): один ответ sqlite о файле — снимок, а не приговор).

Почему это тупик без вмешательства. Голова очереди — этот PR, а из main обновляется только голова. #1540 стоит behind и не может уехать, хотя его ci-complete зелёный. То есть починка ждёт того, кого она чинит.

Что делает hold. Снимает этот PR с головы очереди, мувер переходит к #1540, тот обновляется и мержится. После этого метка снимается, ветка обновляется из main уже с починкой, и Windows перестаёт мигать.

Обновить ветку отсюда нельзя: merge-коммит уехал бы от имени бота (CLAUDE.md § Гейты).


Generated by Claude Code

@claude claude Bot added the hold Мержить только по решению владельца: авто-мерж не включается, merge-when-green снимается label Sep 9, 2026
@ArtVsMark ArtVsMark removed the merge-when-green Согласие смержить без автора: авто-мерж включится, как позеленеет label Sep 9, 2026
@ArtVsMark
ArtVsMark disabled auto-merge September 9, 2026 11:27
@ArtVsMark ArtVsMark added queue-frozen Заморозка конвейера: база красная, согласие вернётся само and removed queue-frozen Заморозка конвейера: база красная, согласие вернётся само labels Sep 9, 2026
@ArtVsMark ArtVsMark added queue-frozen Заморозка конвейера: база красная, согласие вернётся само and removed queue-frozen Заморозка конвейера: база красная, согласие вернётся само labels Sep 13, 2026
@ArtVsMark ArtVsMark added queue-frozen Заморозка конвейера: база красная, согласие вернётся само and removed queue-frozen Заморозка конвейера: база красная, согласие вернётся само labels Sep 21, 2026
@ArtVsMark ArtVsMark removed the hold Мержить только по решению владельца: авто-мерж не включается, merge-when-green снимается label Oct 1, 2026
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com>
@ArtVsMark ArtVsMark added the merge-when-green Согласие смержить без автора: авто-мерж включится, как позеленеет label Oct 1, 2026
@ArtVsMark
ArtVsMark enabled auto-merge (squash) October 1, 2026 09:57
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com>
@ArtVsMark
ArtVsMark merged commit bc648b8 into main Oct 1, 2026
22 checks passed
@ArtVsMark
ArtVsMark deleted the agent/gate-says-where-the-package-came-from branch October 1, 2026 11:58
ArtVsMark added a commit that referenced this pull request Oct 1, 2026
Переход #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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/ci CI/CD и скрипты (.github/, scripts/) merge-when-green Согласие смержить без автора: авто-мерж включится, как позеленеет tech-debt

Projects

None yet

2 participants