Skip to content

ci: zamknij limity 600 linii i CC≤10 bramkami (faza 6)#71

Merged
mpasternak merged 1 commit into
mainfrom
cleanup/faza-6-bramki
Jul 24, 2026
Merged

ci: zamknij limity 600 linii i CC≤10 bramkami (faza 6)#71
mpasternak merged 1 commit into
mainfrom
cleanup/faza-6-bramki

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Cały refaktor był odwracalny w 2–3 PR-ach — dokładnie tak repo urosło do stanu wyjściowego. Ta faza czyni regresję niemożliwą do zmergowania, a nie tylko niezalecaną.

1. Bramka complexity w ruff

[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B", "C901"]   # ← C901 dodane
ignore = ["UP040"]                             # ← bez zmian
[tool.ruff.lint.mccabe]                        # ← nowa sekcja
max-complexity = 10

per-file-ignores bez zmian, zero wpisów C901. Zweryfikowane: ruff check . przechodzi (jedyny wcześniejszy szum to UP040, już ignorowany), a wstrzyknięcie funkcji o CC 12 jest łapane (C901 deep is too complex (12 > 10)).

2. Hook 600 linii

Ruff nie ma reguły na długość pliku → scripts/check_file_length.py (tylko stdlib, 68 linii, każda funkcja CC≤10 — sam podlega obu bramkom). Wpięty jako repo: local w pre-commit, files: ^(guidebot_recorder|tests|scripts)/.*\.py$.

Zakres .py; komentarz w configu mówi, gdzie dodać \.js$ po Fazie 7. Zweryfikowane: przechodzi na obecnym drzewie, łapie plik 700-liniowy (exit=1 z komunikatem).

Obie bramki obejmują tests/

W połowie tej operacji pomiar skanujący tylko guidebot_recorder/ przeoczył szesnaste naruszenie C901 siedzące w pliku testowym. Narzędzie pomiarowe musi mieć ten sam zakres co bramka. C901 to ruff check . (całe repo; tests/** ignoruje tylko E501); hook ma tests/ w regexie.

3. CLAUDE.md

Repo go nie miało. Zapisuje reguły nieoczywiste, które przyszły współpracownik (człowiek lub AI) „uprościłby" i przywrócił usunięte problemy:

  • wzorzec fasada+szew i dlaczego re-eksport wstrzymanej nazwy to cicha regresja
  • wołanie szwów przez obiekt modułu, nie from .x import seam
  • strażniki AST (test_*_seams.py, tests/_seam_guard.py), których nie wolno osłabiać
  • brak conftest.py i fabryka zamiast fixture (dlaczego — F811)
  • że match nie obniża CC w ruffie, a zagnieżdżony def dolicza swoją

Napisane wobec prawdziwych docstringów fasad i _seam_guard, nie generycznie.

Weryfikacja

Zero zmian zachowania Pythona. import guidebot_recorder OK. ruff check . (0.15 i 0.9.2) czysto. Format-drift 12 plików pre-existing — nietknięty.

Po tym PR limity są egzekwowane maszynowo przy każdym push.

🤖 Generated with Claude Code

https://claude.ai/code/session_0134rSCftVxsMVL8sngceT7A

Cały refaktor był odwracalny w 2-3 PR-ach — dokładnie tak repo urosło do
stanu wyjściowego. Ta faza czyni regresję niemożliwą do zmergowania,
a nie tylko niezalecaną.

1. Bramka complexity w ruff: C901 dodane do select, [tool.ruff.lint.mccabe]
   max-complexity = 10. ignore=["UP040"] i per-file-ignores bez zmian; ZERO
   wpisów C901 w per-file-ignores. Zweryfikowane: ruff check . przechodzi
   (jedyny wcześniejszy szum to UP040, już ignorowany), a wstrzyknięcie
   funkcji o CC 12 jest łapane.

2. Hook 600 linii: scripts/check_file_length.py (tylko stdlib, 68 linii,
   każda funkcja CC≤10 — sam podlega obu bramkom). Wpięty jako repo:local
   w pre-commit, files: ^(guidebot_recorder|tests|scripts)/.*\.py$.
   Zakres .py; komentarz mówi, gdzie dodać \.js$ po fazie 7.
   Zweryfikowane: przechodzi na obecnym drzewie, łapie plik 700-liniowy
   (exit=1 z komunikatem).

OBIE bramki obejmują tests/, nie tylko guidebot_recorder/ — w połowie tej
operacji pomiar skanujący tylko pakiet przeoczył 16. naruszenie C901 w pliku
testowym. Narzędzie pomiarowe musi mieć ten sam zakres co bramka. C901 to
ruff check . (całe repo, tests/** ignoruje tylko E501); hook ma tests/
w regexie.

3. CLAUDE.md (repo nie miało): zapisuje reguły nieoczywiste, które przyszły
   współpracownik "uprościłby" i przywrócił usunięte problemy — wzorzec
   fasada+szew i dlaczego re-eksport wstrzymanej nazwy to cicha regresja;
   wołanie szwów przez obiekt modułu; strażniki AST, których nie wolno
   osłabiać; brak conftestu i fabryka zamiast fixture (F811); że match nie
   obniża CC. Napisane wobec prawdziwych docstringów fasad i _seam_guard.

Zero zmian zachowania Pythona. import guidebot_recorder OK. ruff (0.15 i 0.9.2)
czysto. Format-drift 12 plików pre-existing, nietknięty.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0134rSCftVxsMVL8sngceT7A
@mpasternak
mpasternak merged commit 32ac72e into main Jul 24, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant