WCAG faza 3: bramka axe-core o progu zero + naprawa 15 naruszeń - #793
Open
mpasternak wants to merge 16 commits into
Open
WCAG faza 3: bramka axe-core o progu zero + naprawa 15 naruszeń#793mpasternak wants to merge 16 commits into
mpasternak wants to merge 16 commits into
Conversation
…ka axe Faza zmienia rodzaj zabezpieczenia: zamiast kolejnego kryterium wprowadza automat pilnujacy wszystkich naraz na stronach objetych testami. Spec stoi na POMIARZE, nie na przypuszczeniu. axe-core 4.13 na trzech stronach dal 13 narusze w dwoch regulach (`color-contrast`, `label`), a nie setki, ktorych sie spodziewalem — stad decyzja o progu na zero zamiast pliku baseline. Przy trzynastu rzeczach baseline to wiecej maszynerii niz same naprawy. Pomiar obalil tez hipoteze audytu 08-05, ze 2.5.8 (Target Size) to najliczniejsza kategoria: regula `target-size` wykonala sie i wyladowala w `passes`. Sprawdzone wprost, bo brak reguly w wyniku moglby znaczyc "nie uruchomila sie". Rozdzielone tez to, co nasze, od tego, co klienta: 12 z 13 narusze to zwykle szarosci (#7f8c8d, #6c757d), wspolne dla motywow. Jedno dotyka zieleni motywu (#008000, 4.46 przy wymaganych 4.5) — spec 08-05 nie oddaje takich decyzji zespolowi, wiec to punkt decyzyjny PO pomiarze wszystkich szesciu motywow, nie zadanie do wykonania. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Recenzja znalazla jeden blad blokujacy i jeden merytoryczny; oba
zweryfikowalem w kodzie, zanim je przyjalem.
BLOKUJACY: bramka na zero byla nieosiagalna. `.breadcrumbs a{color:green}`
z `app-green.css` (motyw domyslny testow) daje kontrast 4.46 przy
wymaganych 4.5, a breadcrumbs sa na WSZYSTKICH trzech stronach bramki.
Spec robil z tej naprawy punkt warunkowy "do decyzji po pomiarze" i nie
zauwazyl, ze bramka od niej zalezy. Punkt jest teraz obowiazkowy, z jawna
zaleznoscia.
MERYTORYCZNY: naduzylem ustalenia z 08-05 o brandingu. Ono mowi o motywach
KLIENCKICH — "vizja, mwsl, uafm to motywy konkretnych klientow, nie
warianty produktu" (08-05:985). `app-green` jest motywem produktowym
i domyslnym, wiec jego przyciemnienie to decyzja zespolu. Cala warunkowosc
tamtego punktu stala na tym naduzyciu.
Zakres naprawy `label` byl zawezony do jednej strony. Ten sam nieopisany
`input[type=text][name=suggested-title]` jest w czterech szablonach;
sprawdzilem typy pol, bo w wiekszosci miejsc to `hidden` (te axe slusznie
pomija). Przy okazji: `browse/tytul_raportu.html` nie jest nigdzie
includowany — moze byc martwy, jak ten usuniety w fazie 1.
Zakres przyciemniania szarosci byl niedookreslony: to ~40 literalow, w tym
w aplikacjach za logowaniem, gdzie `#6c757d` bywa `background-color` i
"przyciemnienie do 4.5:1 na swoim tle" nie ma sensu. Zawezony do deklaracji
`color:` w czesci publicznej, z wyliczonymi plikami.
Dolozone: polityka dla wynikow `incomplete` (nie blokuja, ale sa wypisywane
— naruszenie moze tam zmigrowac i cicho zniknac), regula dolaczania
kolejnych stron (inaczej zestaw zamarza na trzech), opis danych testowych
plus asercja sanity (przy progu zero ubogi fixture daje bramke
przechodzaca pusto), sekcja o stosunku do architektury bramki z 08-05
(co unieważniamy, co odraczamy, co zachowujemy), tag `wcag22a` zgodnie
z jawna decyzja 08-05, oraz uwaga o przypietej wersji axe-core.
Poprawione: arytmetyka 13 -> 14 (6+1+4+3), w tym w uzasadnieniu decyzji
o baseline. Usuniety argument "utrzymywac baseline dla szesciu motywow" —
przeczyl wlasnemu ustaleniu, ze bramka biegnie w jednym motywie.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Druga recenzja (Codex) znalazla dwie rzeczy krytyczne PONAD to, co znalazla pierwsza. Obie zweryfikowalem w repo, zanim je przyjalem, i obie wywrocilyby wdrozenie. BLOKER 1: `axe.min.js` nie istnieje w obrazie, w ktorym biegna testy na CI. Workflow buduje target `test-runner` (tests.yml:257), a ten dostaje wylacznie gotowe assety — komentarz w Dockerfile mowi wprost "bez Node, Yarn, Grunta i node_modules". Moj spec powolywal sie na Dockerfile:499, ktora nalezy do INNEGO stage'a (`testserver`, lokalny). Wstrzykiwanie z hostowego `node_modules` przeszloby lokalnie i padlo na CI, na `add_script_tag`, zanim axe w ogole ruszy. Spec wymaga teraz jawnego COPY samego pliku do `test-runner` i weryfikacji W TYM obrazie — lokalna suita niczego tu nie dowodzi. BLOKER 2: zakres SCSS pomijal glowne zrodlo naruszen. `_autor-bem.scss` ma cztery wystapienia `#7f8c8d` i to on stoi za czterema z szesciu naruszen kontrastu na stronie autora. Wymienilem `_autor-legacy.scss`, a tego pliku nie. Doslowna realizacja listy zostawilaby prog zero nieosiagalnym. Poza tym: nazwy motywow to `app-green`/`app-blue`, nie `green`/`blue`, a motyw bierze sie z mapowania host -> Site -> Uczelnia, wiec szesc rekordow na jednym hoscie zmierzyloby to samo szesc razy. Sanity wzmocnione o status 200, sentinel widoku i WYLACZENIE rerunu (fixture `page` dokłada powtorke, wiec chwiejna bramka "czerwona, potem zielona" zostalaby zaliczona). Polityka `incomplete` poprawiona: samo `print` nie zadziala, bo CI przechwytuje wyjscie — potrzebny artefakt. Mutacja wymagana dla OBU rodzin regul, nie tylko `label`. Naprawy poza bramka sprawdzane semantycznie na DOM, bo `<label>` z blednym `for` istnieje i nic nie wiaze. Dolozona sekcja "Odrzucone propozycje z recenzji" z uzasadnieniami: hybryda zero+ratchet (wraca przy pierwszej stronie z dlugiem nie do splacenia w jednym PR), proces wokol bramki (wlasciciel, SLA, cadence) oraz meta-test na skip/exclude. Dwie pierwsze to maszyneria przed potrzeba, trzecia wraca razem z ratchetem. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Plan realizuje spec 2026-08-17 po dwoch recenzjach adwersarialnych. Jedna zmiana projektowa wzgledem specu: zamiast edytowac Dockerfile, axe.min.js jedzie do statykow zadaniem grunta — tym samym wzorcem, ktorym repo kopiuje juz Rollbara (shell:copyRollbar). Dziala lokalnie i w obrazie CI bez dotykania definicji obrazu, wiec mniej ruchomych czesci. Kolory sa POLICZONE, nie oszacowane, i z zapasem ponad prog 4.5, zeby drobna zmiana tla nie wywrocila bramki: #7f8c8d -> #68706f (5.08 na bialym, 4.82 na #f8f9fa) #6c757d -> #636b73 (5.41 na bialym, 5.13 na #f8f9fa) green -> #006e00 (5.65 na #efefef) Zrodlo zieleni ustalone: `primary: green` w palecie Foundation (_settings_green.scss:76), nie zmienna breadcrumbs. Stad override punktowy w motywie zamiast zmiany palety, ktora przemalowala by caly motyw. Zadanie 1 ma krok budujacy obraz `test-runner` i sprawdzajacy w NIM obecnosc pliku — lokalna suita niczego tu nie dowodzi, bo lokalnie node_modules istnieje. Zadanie 5 wymaga mutacji OBU egzekwowanych rodzin regul (`label` i `color-contrast`) oraz wylacza automatyczny rerun fixture'u `page`: naruszenie dostepnosci nie znika przy drugim podejsciu, wiec rerun zamienilby je w migotanie i przepuscil. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Task 2 kazal naprawic cztery szablony, a lista parametryzacji obejmowala dwa. Dopisane wyjasnienie: autor.html pilnuje bramka axe na realnej stronie (mocniejsze niz render szablonu), a tytul_raportu.html wchodzi do listy tylko jesli Step 1 wykaze, ze szablon zyje. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Obraz `test-runner`, w ktorym CI uruchamia testy, NIE zawiera node_modules — assety kompiluje osobny stage, a do finalnego obrazu trafiaja tylko gotowe pliki. Wstrzykiwanie axe prosto z node_modules przeszloby lokalnie i padlo na CI. Grunt kopiuje wiec axe.min.js do statykow tym samym wzorcem, ktorym repo kopiuje juz Rollbara (shell:copyRollbar). Katalog jest gitignorowany jako artefakt builda. Zadanie shell:copyAxe jest wpisane zarowno do `build` (make assets, lokalnie) jak i do `build-non-interactive` — to druga lista faktycznie uzywana przez `docker/bpp_base/Dockerfile` w stage'u `test-assets-builder`, ktory buduje obraz `test-runner`. Sam wpis w `build` nie wystarczylby: `test-runner` nigdy nie uruchamia `build` (z collectstatic), tylko `build-non-interactive`. Helper trzyma tagi i wstrzykiwanie w jednym miejscu, zeby zmiana konfiguracji bramki byla widoczna w przegladzie kodu jako jeden plik. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
axe zglosil `label` o wadze critical dla pola "Tytul raportu" na stronie
autora. To samo nieopisane pole jest w kolejnych szablonach, ktorych bramka
axe nie obejmuje — stad osobne testy szablonowe.
Testy sprawdzaja POWIAZANIE, nie obecnosc znacznika: `<label>` z blednym
`for` istnieje i niczego nie wiaze. Zweryfikowane mutacja — podmiana `for`
na nieistniejace id zapala test.
Warianty `type="hidden"` tego samego pola zostaja bez zmian; ukryte pola nie
wymagaja etykiety i axe slusznie je pomija.
`browse/tytul_raportu.html` okazal sie martwym szablonem (zaden widok ani
`{% include %}`, literalny czy dynamiczny, go nie uzywal) — usuniety, nie
dopisany do parametryzacji testu.
Testy renderuja jednostka.html/zrodlo.html przez `render_to_string(...,
request=...)` zamiast pustego kontekstu z briefu: oba szablony dziedzicza
przez base.html -> bare.html, ktore czytaja `context.request` (tag
`czy_pokazywac`) i filtruja `uczelnia.skrot` jako argument filtra (nie
przechodzi przez bezpieczny mechanizm string_if_invalid) — bez realnego
`request` i procesorow kontekstu render pada zanim dojdzie do asercji.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Runda 1 recenzji Task 2: `"aria-label=" in pole.lower()` sprawdzalo
obecnosc atrybutu, nie jego wartosc. `aria-label=""` USUWA dostepna
nazwe (WCAG 4.1.2), a test i tak by go zaliczyl jako poprawny — sprzeczne
z docstringiem pliku ("sprawdzamy POWIAZANIE, nie obecnosc znacznika").
Zamieniono substring-check na `re.search(r'aria-label="([^"]*)"', ...)`
+ sprawdzenie niepustej wartosci po `.strip()`. Ta sama poprawka dla
`id=""` przy okazji — bez niej `identyfikator` moglby wyjsc pusty i dac
mylacy komunikat `for=""` zamiast czytelnego "pole bez dostepnej nazwy"
(nie byla to falszywa zielen, tylko mylacy komunikat bledu).
Zweryfikowane mutacja: input z samym `aria-label=""` (bez id, bez
<label>) w jednostka.html teraz PADA z "pole bez dostepnej nazwy" —
przed poprawka taki wariant przechodzilby jako zielony. Przywrocono
szablon do stanu z commita 851e732 (brak zmian w git diff po mutacji).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
axe zglosil `color-contrast` na trzech publicznych stronach. Zrodlem sa dwa kolory: #7f8c8d (3.48 na bialym) i #6c757d (4.45 na #f8f9fa). Oba schodza ponizej progu 4.5 wymaganego dla tekstu. Nowe wartosci policzone, nie oszacowane, i z zapasem ponad prog, zeby drobna zmiana tla nie wywrocila bramki: #7f8c8d -> #68706f (5.08 na bialym, 4.82 na #f8f9fa) #6c757d -> #636b73 (5.41 na bialym, 5.13 na #f8f9fa) Zmienione WYLACZNIE deklaracje `color:`. Wystapienia jako tlo i ramka zostaja — tam prog kontrastu tekstu nie obowiazuje, a zmiana byla by czysto kosmetyczna i poza zakresem audytu. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`primary: green` z palety Foundation (_settings_green.scss:76) to #008000, co na tle paska breadcrumbs (#efefef) daje 4.47 — ponizej progu 4.5 dla tekstu. Brakowalo 0,03. Override jest punktowy CELOWO. Zmiana palety naprawila by kontrast, ale przemalowala przy okazji caly motyw: przyciski, linki, akcenty. Chodzi o jeden element, wiec zmieniamy jeden element. app-green jest motywem produktowym i domyslnym, wiec to decyzja zespolu. Ustalenie z audytu 08-05 o tym, ze poprawa kontrastu zmienia branding klienta, dotyczy motywow vizja, mwsl i uafm — nie tego. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Bramka sprawdza WCAG 2.2 A i AA na stronie autora, stronie uczelni i w grafie powiazan. Prog to zero narusze, bez pliku baseline — przy czternastu naprawionych rzeczach zapadka bylaby drozsza niz naprawa. Zielona bramka NIE MOZE znaczyc "nie zmierzylismy". Stad trzy zabezpieczenia: osobny test sanity (axe sie zaladowal i cos ocenil), asercja status 200 i sentinel wlasciwego widoku per strona. Wspolny base.html dziedziczy nawet strona bledu, wiec sama obecnosc elementow niczego nie dowodzi. Wyniki `incomplete` nie blokuja, ale sa wypisywane — naruszenie potrafi tam zmigrowac (np. po zmianie tla na polprzezroczyste) i cicho zniknac. Wartosc bramki sprawdzona mutacja OBU egzekwowanych rodzin regul: usuniecie etykiety zapala `label`, rozjasnienie zieleni zapala `color-contrast`. Mutacja tylko jednej dowodzila by polowy. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1. `incomplete` przez `print` bylo iluzoryczne pod CI/xdist (stdout przechodzacego testu jest odrzucany). Zamieniono na `warnings.warn`, ktore przezywa domyslne przechwytywanie pytest — zweryfikowane empirycznie bez `-s`. 2. Strona uczelni nie miala dowodu czerwieni. Manualna mutacja (usuniecie `alt` z logo) potwierdzila `image-alt`; przywrocono. 3. Sanity-test (`ocenione > 10`) nie lapal zawezenia tagow WCAG. Dodano asercje, ze `color-contrast` i `label` sa w sumie ocenionych regul; mutacja TAGI (usuniecie wariantow `*aa`) potwierdzila skutecznosc. 4. Strona uczelni skanowala losowana tresc `#rotating-tips` (3 z 15 porad maja `<a href>`) — zrodlo prawdziwej flakinesci bramki. Ustabilizowano DOM (`add_init_script` + zamrozenie #tip-text) przed skanem. Stabilizacja ujawnila PRAWDZIWE naruszenie 1.4.3 w linku porady (dziedziczyl domyslna zielen motywu) — naprawiono w `app-green.scss`, rozszerzajac istniejacy override kontrastu breadcrumbs o `#tip-text a` (ten sam wrapper, to samo tlo, ta sama matematyka kontrastu). 5. Docstring modulu dostal jawna sekcje "czego bramka NIE pokrywa" — zasieg to trzy strony, nie caly serwis; szarosci z Zadania 3 poza tymi stronami nie sa pilnowane automatem. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Rozpoznanie, nie naprawa. Bramka biegnie w motywie domyslnym `app-green`, wiec o pozostalych pieciu nie wiedzielismy nic — a kontrast zalezy od motywu. Pomiar wymagal asercji, ze faktycznie zaladowal sie zadany arkusz: motyw bierze sie z mapowania host -> Site -> Uczelnia, a nie z ogladanego obiektu, wiec szesc rekordow Uczelnia na jednym hoscie zmierzyloby szesc razy to samo. Naprawy w motywach klienckich (vizja, mwsl, uafm) NIE wchodza do tej fazy — audyt 08-05 nie oddaje takich decyzji zespolowi. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1. Bramka nie sprawdzala, czy arkusz motywu sie zaladowal. Dodano `_arkusz_motywu_zaladowany` (document.styleSheets + cssRules.length), wolane z `_sprawdz_strone` z domyslnym motyw="app-green". Bez tego HTTP 200 + sentinel nie dowodzily, ze axe mierzy ostylowana strone. 2. Sanity lapal tylko polowe zawezenia tagow. Dolozono niezalezna asercje na dokladny zestaw `axe_helper.TAGI` obok istniejacego sprawdzenia rodzin regul color-contrast/label. 3. Bramka strony uczelni mierzyla string z testu, nie tresc z szablonu. `_PRZECHWYC_INTERVAL_JS` nadpisuje teraz tez `Math.random` (-> 0), co wymusza wybor prawdziwego tips[0] z tablicy w szablonie zamiast zahardkodowanej kopii pierwszej porady w innerHTML. 4. `test_etykiety_pol.py` sprawdzal HTML regexem. Przepisano na `lxml.html.fromstring(...).xpath(...)` (wzorzec z test_alt_obrazy.py), z zachowaniem tych samych warunkow akceptacji + nowa asercja na unikalnosc `id` (zdublowany id rozrywa powiazanie label<->input). 5-6. Dokument-rozdzielacz `2026-08-13-wcag-stan-i-pozostale-prace.md` przeciwil sam sobie (mapa dokumentow bez fazy 3, kroki (4)/(5) jako otwarte mimo dzialajacej bramki). Dopisano faze 3 do mapy, przepisano kroki (4)/(5) pod stan faktyczny (zero-prog bez baseline, trzy strony, jeden motyw), dopisano zasieg bramki i regule dolaczania stron ze specu fazy 3. W sekcji "Kontrast w motywach" przeniesiono z gitignored ledgera przyczyne zrodlowa (nieoverride'owany $anchor-color na tle breadcrumbs #efefef) i policzone kontrasty (vizja 1.83, orange 2.73, mwsl 3.17, blue 4.08 FAIL, uafm 5.93 PASS) + rozroznienie motywow produktowych (blue/orange) od klienckich (vizja/mwsl). 7. axe-core (580 KB) trafial do statyków produkcyjnych. Dopisano wykluczenie w dwoch miejscach: `make production-assets` (wzorzec z recenzji) oraz `--ignore axe` w `collectstatic` builder-stage'a `docker/bpp_base/Dockerfile` — to drugie miejsce faktycznie kontroluje zawartosc `staticroot.baked` publikowanego obrazu, `production-assets` nie jest tam wolane. Obraz test-runner (CI) jest nietkniety. Testy: `test_wcag_bramka_axe.py` + `test_wcag/` — 32 passed. Mutacje zweryfikowane recznie dla pkt 1 i 4 (w tym nowa galaz "zdublowany id"), przywrocone. `docker buildx build --check` na Dockerfile: czysto. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ledger przebiegu (`.superpowers/`) jest gitignorowany i znika razem z worktree. Dwie rzeczy ustalone przy fazie 3 zylyby tylko tam: 1. Te same dwie szarosci, ktore faza przyciemnila w czesci publicznej, wystepuja tez w arkuszach za logowaniem i w kilku innych aplikacjach. Swiadomie poza zakresem (audyt deklaruje czesc publiczna dla anonima), ale to gotowa lista miejsc, gdyby zakres sie poszerzyl. 2. src/bpp/static/scss/*.css sa SLEDZONE w gicie mimo .gitignore i sa przy tym MARTWE — grunt ich nie kompiluje, zaden szablon nie linkuje, a browse.css to zastygly zrzut bledu kompilacji Sass sprzed lat. Przedistniejace, niezwiazane z WCAG, warte osobnego zgloszenia. To jest dokladnie ta awaria, przed ktora ten dokument mial chronic — akapit otwierajacy tlumaczy jego istnienie tym, ze wiedza o pozostalych prac ach zyla w katalogu znikajacym razem z worktree. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Trzecia faza dostosowania do WCAG 2.2 AA. Poprzednie zamykały pojedyncze kryteria wskazane lekturą kodu; ta zmienia rodzaj zabezpieczenia — zamiast kolejnego kryterium wprowadza automat pilnujący wszystkich naraz na stronach objętych testami.
Stacked na #763 (faza 2). Po scaleniu tamtego trzeba przepiąć bazę na
dev.Dlaczego
Wszystko, co naprawiły fazy 1 i 2, chronią wyłącznie testy, które ktoś pomyślał, żeby napisać. Sama faza 2 dostarczyła trzech dowodów, że to za mało: asercja przybliżania grafu przechodziła, bo
cy.fit()dobijał domaxZoom; guardy sprawdzały regexem obecność zamiast semantyki, więc przepuszczały odwróconą logikę; stublocalStoragenie działał, boStoragew jsdom to legacy platform object. Każdy wyszedł dopiero przy próbie zepsucia kodu.Co powstało
Bramka axe-core, próg zero naruszeń, na stronie autora, stronie uczelni i w grafie powiązań. Bez pliku baseline — przy czternastu naprawianych naruszeniach zapadka byłaby droższa niż sama naprawa.
15 naprawionych naruszeń: brakujące etykiety pól formularza w trzech szablonach (
label, critical), dwie szarości poniżej progu kontrastu w 21 plikach SCSS, kontrast linków breadcrumbs w motywie domyślnym, oraz — odkryte po drodze — kontrast linków w rotujących poradach na stronie głównej.Pomiar kontrastu we wszystkich sześciu motywach, z ustaloną przyczyną źródłową.
Zielona bramka nie może znaczyć „nie zmierzyliśmy"
To była główna troska przy projektowaniu. Zabezpieczenia:
base.htmldziedziczy nawet strona błędu, więc sama obecność elementów niczego nie dowodzi;wcag2aazabiłoby całą rodzinęcolor-contrastbezgłośnie;Wartość bramki sprawdzona mutacją obu egzekwowanych rodzin reguł: usunięcie etykiety zapala
label, rozjaśnienie koloru zapalacolor-contrast. Mutacja jednej dowodziłaby połowy.Wyniki
incompletenie blokują, ale są utrwalane przezwarnings.warn— samoprintnie przeżyłoby przechwytywania wyjścia w CI, a naruszenie potrafi zmigrować zviolationsdoincompletei cicho zniknąć.Czego ta gałąź NIE dowozi
Piszę wprost, żeby nikt nie przeczytał „istnieje bramka axe" jako „1.4.3 jest pilnowane wszędzie":
app-bluema 3 naruszenia, aapp-orange8 — oba to motywy produktowe, więc ich naprawa jest tą samą decyzją co przyapp-green. Poza zakresem tej fazy.Pomiar motywów
app-greenapp-uafmapp-blueapp-mwslapp-orangeapp-vizjaJedna przyczyna źródłowa: linki breadcrumbs używają nieoverride'owanego
$anchor-color := $primary-colorna tle#efefef. Naprawa to ten sam jednolinijkowy override per motyw.app-vizjaz 1.83 to nie kwestia zaokrąglenia — to wyraźnie nieczytelny tekst.Weryfikacja
Na świeżych kontenerach, bez
PYTEST_TESTCONTAINERS_REUSE(współdzielona baza unieważnia werdykt przy testach zależnych od stanu):Wykonane jako 7 zadań, każde z osobną recenzją, plus recenzja całej gałęzi i jedna runda poprawek. Recenzje wyłapały sześć defektów w samym planie — m.in. to, że obraz CI kompiluje assety zadaniem
build-non-interactive, niebuild, więcaxe.min.jsprzeszedłby testy lokalne i nie trafił do obrazu.🤖 Generated with Claude Code