diff --git a/.paul/ROADMAP.md b/.paul/ROADMAP.md
index e30daa1..fe82d56 100644
--- a/.paul/ROADMAP.md
+++ b/.paul/ROADMAP.md
@@ -40,6 +40,7 @@ Status: Planning
| 17 | Cart summary transport cost fix | 1 | Done | 2026-04-20 |
| 18 | Google feed permutation URL fix | 1 | Done | 2026-04-30 |
| 19 | Frontend meta tags fix (category + product) | 1 | Done | 2026-05-13 |
+| 20 | Category edit mojibake fix (UI labels) | 1 | Done | 2026-05-13 |
## Feature
@@ -140,4 +141,13 @@ Status: Planning
**Scope:** Diagnostyka (pp_routes + meta w DB + sesyjny $page), checkpoint:decision z 4 opcjami fixu (routes/engine/data/session), implementacja wybranej opcji w `LayoutEngine.php` lub `index.php`, test jednostkowy, human-verify na 3 URL-ach.
---
-*Last updated: 2026-05-13 (Phase 19 complete)*
+### Phase 20 — Category edit mojibake fix
+
+**Problem:** Etykiety formularza edycji kategorii (`/admin/shop_category/category_edit/id=X`) pokazują double-encoded UTF-8 mojibake: `Treść` zamiast "Treść", `JÄ™zyk domyĹ›lny` zamiast "Język domyślny", `Sortowanie produktĂłw` zamiast "Sortowanie produktów" itp.
+
+**Root cause:** Plik `admin/templates/shop-category/category-edit.php` został kiedyś zapisany z UTF-8 zinterpretowanym jako Windows-1252 i ponownie zakodowanym do UTF-8. 9 wystąpień. To JEDYNY taki plik w całym repo — grep `Ä[\x{84}-\x{99}]|Ĺ|Ăł` po całym `admin/templates/`, `templates/`, `autoload/` nie wskazuje innych dotknietych plików.
+
+**Scope:** Podmienić 9 hardcoded labelek na poprawne polskie znaki (Treść, Język domyślny, Tytuł, rozwinięcie, Sortowanie produktów, Wyświetlić podkategorie, Blokuj indeksację). Brak zmian w logice/HTML structure, plik zostaje UTF-8 bez BOM. Human-verify w panelu admina.
+
+---
+*Last updated: 2026-05-13 (Phase 20 complete)*
diff --git a/.paul/STATE.md b/.paul/STATE.md
index 0c801e8..c9bd2ed 100644
--- a/.paul/STATE.md
+++ b/.paul/STATE.md
@@ -5,19 +5,19 @@
See: .paul/PROJECT.md (updated 2026-04-30)
**Core value:** Właściciel sklepu ma pełną kontrolę nad sprzedażą online w jednym systemie pisanym od podstaw, bez narzutów zewnętrznych platform.
-**Current focus:** Phase 19 complete — loop closed
+**Current focus:** Phase 20 complete — loop closed
## Current Position
Milestone: Hotfix
-Phase: 19 of 19 (Frontend meta tags fix) — Complete
-Plan: 19-01 complete
+Phase: 20 of 20 (Category edit mojibake fix) — Complete
+Plan: 20-01 complete
Status: UNIFY complete, ready for next PLAN loop (transition-phase git commit pending)
-Last activity: 2026-05-13 — Closed loop for .paul/phases/19-frontend-meta-tags-fix/19-01-PLAN.md
+Last activity: 2026-05-13 — Closed loop for .paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md
Progress:
- Milestone: [##########] 100% (Hotfix rolling)
-- Phase 19: [##########] 100%
+- Phase 20: [##########] 100%
## Loop Position
@@ -45,10 +45,15 @@ Phase 16: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-04-19]
Phase 17: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-04-20]
Phase 18: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-04-30]
Phase 19: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-05-13]
+Phase 20: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-05-13]
```
## Accumulated Context
### Decisions
+- 2026-05-13: Phase 20 loop closed with SUMMARY at .paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md
+- 2026-05-13: Transition-phase git commit for Phase 20 not executed in this UNIFY run (deferred — pattern z faz 15-19)
+- 2026-05-13: Phase 20 APPLY complete — 9 wystąpień mojibake w admin/templates/shop-category/category-edit.php naprawionych (Treść, Język domyślny x2, rozwinięcie, Sortowanie produktów, Wyświetlić podkategorie, Tytuł kategorii, Blokuj indeksację); suita 846 zielona; human-verify approved
+- 2026-05-13: Created Phase 20 plan at .paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md — fix mojibake w labelkach formularza edycji kategorii (double-encoded UTF-8 w admin/templates/shop-category/category-edit.php, 9 wystąpień, jedyny dotknięty plik w repo)
- 2026-05-13: Phase 19 loop closed with SUMMARY at .paul/phases/19-frontend-meta-tags-fix/19-01-SUMMARY.md
- 2026-05-13: Transition-phase git commit for Phase 19 not executed in this UNIFY run (deferred — pattern z faz 15/16/17/18)
- 2026-05-13: Phase 19 APPLY complete — LayoutEngine.php zmodyfikowany (3 gałęzie + nowa metoda applyEntityMetaToPage), test LayoutEngineMetaTagsTest 5 testów/18 asercji, suita 846 zielona; weryfikacja na produkcji (curl) pokazuje poprawne tytuły dla /sen-i-otulenie, /kocyk-niemowlaka-... i /
@@ -103,17 +108,17 @@ None.
### Blockers/Concerns
None.
-### Skill Audit (Phase 19)
+### Skill Audit (Phase 20)
| Expected | Invoked | Notes |
|----------|---------|-------|
-| /feature-dev | ○ | User-approved override (hotfix z konkretną instrukcją) |
-| /koniec-pracy | ○ | Pending — uruchomić przy zakończeniu sesji jeśli release wchodzi do update package |
+| /feature-dev | ○ | Trivialny fix labelek — override per pattern poprzednich faz |
+| /koniec-pracy | ○ | Pending — uruchomić przy release update package |
## Session Continuity
Last session: 2026-05-13
-Stopped at: Phase 19 complete, loop closed
+Stopped at: Phase 20 complete, loop closed
Next action: Start next phase plan (transition-phase git commit pending), lub uruchomić /koniec-pracy jeśli zamykamy sesję
-Resume file: .paul/phases/19-frontend-meta-tags-fix/19-01-SUMMARY.md
+Resume file: .paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md
---
*STATE.md — Updated after every significant action*
diff --git a/.paul/changelog/2026-05-13.md b/.paul/changelog/2026-05-13.md
index 09089f2..aea17c8 100644
--- a/.paul/changelog/2026-05-13.md
+++ b/.paul/changelog/2026-05-13.md
@@ -9,9 +9,15 @@
- Task 4 (human-verify): Weryfikacja curl na produkcji — 3 strony pokazują 3 różne `
`, homepage meta nie wycieka
- .gitignore — dodano `temp/` (skrypty diagnostyczne z DB credentials)
+- [Phase 20, Plan 01] Fix mojibake (double-encoded UTF-8) w labelkach formularza edycji kategorii
+- Task 1: Podmiana 9 wystąpień mojibake na poprawne polskie znaki (Treść, Język domyślny, Tytuł kategorii, Sortowanie produktów, Wyświetlić podkategorie, Blokuj indeksację, Opis kategorii rozwinięcie)
+- Task 2: Weryfikacja braku regresji (grep w całym repo — 0 innych plików dotkniętych), suita 846 zielona
+- Task 3 (human-verify): Weryfikacja w panelu admina shoppro.project-dc.pl approved
+
## Zmienione pliki
- `autoload/front/LayoutEngine.php`
+- `admin/templates/shop-category/category-edit.php`
- `tests/Unit/front/LayoutEngineMetaTagsTest.php` (nowy)
- `.paul/phases/19-frontend-meta-tags-fix/19-01-PLAN.md` (nowy)
- `.paul/phases/19-frontend-meta-tags-fix/19-01-SUMMARY.md` (nowy)
diff --git a/.paul/docs/TECH_CHANGELOG.md b/.paul/docs/TECH_CHANGELOG.md
index bdb5dd3..acefae4 100644
--- a/.paul/docs/TECH_CHANGELOG.md
+++ b/.paul/docs/TECH_CHANGELOG.md
@@ -2,6 +2,12 @@
> Chronologiczny log zmian technicznych — co i dlaczego.
+## v0.352 (2026-05-13)
+
+- Naprawiono mojibake w labelkach formularza edycji kategorii w panelu admina (`/admin/shop_category/category_edit/id=X`). Plik `admin/templates/shop-category/category-edit.php` byl kiedys zapisany z UTF-8 zinterpretowanym jako Windows-1252 i ponownie zakodowanym do UTF-8 (classic double-encoding). 9 wystapien naprawione: `Treść`→Treść, `JÄ™zyk domyĹ›lny`→Język domyślny (x2), `rozwiniÄ™cie`→rozwinięcie, `Sortowanie produktĂłw`→Sortowanie produktów, `WyĹ›wietlić podkategorie`→Wyświetlić podkategorie, `TytuĹ‚ kategorii (h1)`→Tytuł kategorii (h1), `Blokuj indeksacjÄ™`→Blokuj indeksację.
+- Wykluczono regresje: grep `Ä[\\x{84}-\\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć|Ĺ„` w `admin/templates/`, `templates/`, `autoload/` zwraca 0 plikow — to byl jedyny przypadek mojibake w repo.
+- Suita PHPUnit bez zmian: 846 testow / 2348 assertions.
+
## v0.351 (2026-05-13)
- Naprawiono wyciek metatagow ze strony glownej na podstrony kategorii/artykulu/produktu: `` wszystkich podstron pokazywal tytul homepage ("Sklep z akcesoriami..."), bo `LayoutEngine::show()` nadpisywal w galezi kategorii/artykulu/produktu tylko `$page['language']['title']`, a `meta_title` z domyslnej strony zylo dalej i wygrywalo w linii substytucji `[TITLE]`.
diff --git a/.paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md b/.paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md
new file mode 100644
index 0000000..bcda045
--- /dev/null
+++ b/.paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md
@@ -0,0 +1,197 @@
+---
+phase: 20-category-edit-mojibake-fix
+plan: 01
+type: execute
+wave: 1
+depends_on: []
+files_modified:
+ - admin/templates/shop-category/category-edit.php
+autonomous: false
+delegation: off
+---
+
+
+## Goal
+Etykiety formularza edycji kategorii (`/admin/shop_category/category_edit/id=X`) pokazują poprawne polskie znaki: "Treść", "Język domyślny", "Tytuł kategorii (h1)", "Wyświetlić podkategorie", "Sortowanie produktów", "Blokuj indeksację", "Opis kategorii (rozwinięcie)" — zamiast mojibake `Treść`, `JÄ™zyk domyĹ›lny`, itp.
+
+## Purpose
+Mojibake w etykietach UI panelu admina utrudnia korzystanie z formularza. Administrator musi się domyślać znaczenia pól. Naprawia profesjonalny wygląd panelu i poprawia UX uzupełniania kategorii (m.in. SEO).
+
+## Output
+- `admin/templates/shop-category/category-edit.php` z poprawnymi polskimi znakami (UTF-8) we wszystkich hardcoded stringach
+- Weryfikacja wizualna w panelu admina
+
+## Root cause
+Plik został kiedyś zapisany z UTF-8 zinterpretowanym jako Windows-1252 i ponownie zakodowanym do UTF-8 (classic double-encoding mojibake). `file` raportuje "UTF-8 text" bo bajty są poprawnym UTF-8 — tyle że ich znaczenie po dekodowaniu UTF-8 to bezsensowne kombinacje znaków łacińskich (Ä, Ĺ, Ă itp.).
+
+Grep `Ä[\x{84}-\x{99}]|Ĺ|Ăł` wskazał, że **tylko ten jeden plik** w całym repo (`admin/templates/`, `templates/`, `autoload/`) jest dotknięty — pozostałe templates mają poprawne UTF-8.
+
+
+
+## Project Context
+@.paul/PROJECT.md
+@.paul/STATE.md
+
+## Source Files
+@admin/templates/shop-category/category-edit.php
+
+## Clarifications
+- **Objaw** — Mojibake (`Ä€„` zamiast `ą`) w labelkach formularza edycji kategorii
+ → Odpowiedź: potwierdzone — mojibake (double-encoded UTF-8)
+- **Pola** — Nie wiem, sprawdź
+ → Odpowiedź (po inspekcji): WSZYSTKIE hardcoded labelki w pliku `category-edit.php` (9 wystąpień), żadne inne pliki templates nie dotknięte
+- **Migracja danych** — chodzi o labelki, nie zapisywane dane
+ → Odpowiedź: plan dotyczy tylko hardcoded stringów w pliku PHP. Dane w bazie (mieszane HTML entities w additional_text) — oddzielny issue, NIE w tym planie
+
+## Wykryte miejsca mojibake (grep)
+
+```
+Line 10: Treść → Treść
+Line 20: JÄ™zyk domyĹ›lny → Język domyślny
+Line 48: Opis kategorii (rozwiniÄ™cie) → Opis kategorii (rozwinięcie)
+Line 87: Sortowanie produktĂłw → Sortowanie produktów
+Line 96: WyĹ›wietlić podkategorie → Wyświetlić podkategorie
+Line 107: JÄ™zyk domyĹ›lny → Język domyślny (duplikat)
+Line 127: TytuĹ‚ kategorii (h1) → Tytuł kategorii (h1)
+Line 159: Blokuj indeksacjÄ™ → Blokuj indeksację
+```
+
+Mapowanie sekwencji (do podmiany):
+- `ć` → `ć`, `Ä…` → `ą`, `Ä™` → `ę`, `Ĺ‚` → `ł`, `Ĺ›` → `ś`, `Ĺ„` → `ń`, `Ĺş` → `ź`, `Ĺľ` → `ż`
+- `Ć` → `Ć`, `Ä„` → `Ą`, `Ę` → `Ę`, `Ĺ` → `Ł`, `Ĺš` → `Ś`, `Ĺƒ` → `Ń`, `Ĺ¹` → `Ź`, `Ĺ˝` → `Ż`
+- `Ăł` → `ó`, `Ă“` → `Ó`
+
+
+
+
+## AC-1: Brak mojibake w pliku
+```gherkin
+Given plik admin/templates/shop-category/category-edit.php po fixie
+When uruchomię grep regex `Ä[\x{84}-\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć`
+Then nie ma żadnego dopasowania (0 linii)
+And plik dalej jest UTF-8 (bez BOM) — sprawdzalne przez `file`
+```
+
+## AC-2: Labelki formularza renderują się z polskimi znakami
+```gherkin
+Given administrator otwiera /admin/shop_category/category_edit/id=10 po deployu
+When sprawdza nazwy tabów i etykiet pól
+Then widzi "Treść", "Ustawienia", "SEO" jako nazwy tabów
+And widzi "Język domyślny", "Tytuł kategorii (h1)", "Sortowanie produktów",
+ "Wyświetlić podkategorie", "Blokuj indeksację", "Opis kategorii (rozwinięcie)"
+ jako etykiety pól
+And NIE widzi `Ä`, `Ĺ`, `Ă` w żadnym widocznym miejscu na tej stronie
+```
+
+## AC-3: Brak regresji w innych szablonach
+```gherkin
+Given fix dotyczy tylko jednego pliku
+When uruchomię grep mojibake w admin/templates/ + templates/ + autoload/
+Then żaden inny plik nie zawiera mojibake (tak jak przed fixem)
+And cała suita PHPUnit (846 testów) pozostaje zielona
+```
+
+
+
+
+
+
+ Task 1: Podmień double-encoded UTF-8 na właściwe polskie znaki
+ admin/templates/shop-category/category-edit.php
+
+ Wykonaj globalne podstawienia w pliku z mojibake → UTF-8 polskie znaki:
+
+ Podstawienia całych słów (najbezpieczniejsze — unikamy fałszywych alarmów z `Ä` w innym kontekście):
+ "Treść" → "Treść"
+ "JÄ™zyk domyĹ›lny" → "Język domyślny"
+ "rozwiniÄ™cie" → "rozwinięcie"
+ "Sortowanie produktĂłw" → "Sortowanie produktów"
+ "WyĹ›wietlić podkategorie" → "Wyświetlić podkategorie"
+ "TytuĹ‚ kategorii (h1)" → "Tytuł kategorii (h1)"
+ "Blokuj indeksacjÄ™" → "Blokuj indeksację"
+
+ Po wszystkich podstawieniach zweryfikuj greppem że żadne mojibake już nie zostało.
+
+ Avoid: globalne sekwencyjne `str_replace` typu `ć` → `ć` bez kontekstu — mogłoby przypadkiem złamać poprawne fragmenty w przyszłości (na razie nie ma ryzyka, ale lepiej trzymać się konkretnych słów).
+ Avoid: zmiana encodingu pliku (musi zostać UTF-8 bez BOM, CRLF — jak teraz).
+ Avoid: jakichkolwiek zmian poza podmianami stringów (struktura HTML, logika, imports — bez zmian).
+
+
+ grep -P "Ä[\x{84}-\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć|Ĺ„" admin/templates/shop-category/category-edit.php
+ → 0 dopasowań
+ file admin/templates/shop-category/category-edit.php → UTF-8 text (bez BOM)
+
+ AC-1 satisfied: plik bez mojibake, dalej UTF-8
+
+
+
+ Task 2: Weryfikacja braku regresji + odpalenie suity testów
+ (brak modyfikacji — weryfikacja)
+
+ 1. Powtórz globalny grep mojibake w admin/templates/, templates/, autoload/ — powinno być 0 plików (poza tym fixowanym, który po Task 1 też ma 0)
+ 2. Uruchom suitę PHPUnit: `php phpunit.phar`
+ 3. Sprawdź że nie ma żadnych nowych failów (oczekiwane: 846 OK)
+
+
+ grep -rl -P "Ä[\x{84}-\x{99}]|Ĺ" admin/templates/ templates/ autoload/ — brak wyniku
+ php phpunit.phar — exit code 0, 846 tests OK
+
+ AC-3 satisfied: brak regresji, suita zielona
+
+
+
+
+ Plik admin/templates/shop-category/category-edit.php z polskimi znakami w UTF-8
+ (auto-upload FTP wysyła zmianę na shoppro.project-dc.pl po zapisie pliku)
+
+
+ 1. Otwórz https://shoppro.project-dc.pl/admin/shop_category/category_edit/id=10 (zaloguj się jeśli trzeba)
+ 2. Sprawdź nazwy 3 tabów: "Treść", "Ustawienia", "SEO" — powinny być po polsku, bez mojibake
+ 3. W tabie "Treść" sprawdź:
+ - tooltip ikony gwiazdki: "Język domyślny"
+ - etykiety pól: "Nazwa kategorii", "Opis kategorii", "Opis kategorii (rozwinięcie)", "Dodatkowy tekst (nad produktami)"
+ 4. W tabie "Ustawienia" sprawdź: "Aktywna", "Sortowanie produktów", "Wyświetlić podkategorie"
+ 5. W tabie "SEO" sprawdź: "Tytuł kategorii (h1)", "Blokuj indeksację"
+ 6. Otwórz inną kategorię (np. id=11) — to samo dla regresji
+
+ Wpisz "approved" by kontynuować, lub opisz issues
+
+
+
+
+
+
+## DO NOT CHANGE
+- Struktura HTML pliku (tagi, klasy CSS, JS scripts)
+- Logika PHP (if/foreach, wywołania Tpl)
+- Inne pliki w admin/templates/shop-category/ — nie są dotknięte mojibake
+- Encoding pliku (musi zostać UTF-8 bez BOM, jak obecnie)
+- Dane w bazie (HTML entities w `additional_text` to oddzielny issue)
+
+## SCOPE LIMITS
+- Plan dotyczy TYLKO pliku `admin/templates/shop-category/category-edit.php`
+- NIE skanujemy wszystkich szablonów admina pod kątem mojibake (już sprawdzone — pozostałe OK)
+- NIE migrujemy danych w DB (admin uzupełnia ręcznie jeśli ma encje)
+- Bez build update package — to robi `/koniec-pracy` po UNIFY
+
+
+
+
+Przed zamknięciem planu:
+- [ ] grep mojibake → 0 wyników w category-edit.php
+- [ ] file potwierdza UTF-8 bez BOM
+- [ ] Suita PHPUnit 846 zielona
+- [ ] Human-verify na 2 kategoriach (id=10 i jeszcze jednej) zatwierdzony
+- [ ] AC-1, AC-2, AC-3 spełnione
+
+
+
+- 9 wystąpień mojibake naprawionych w 1 pliku
+- Brak regresji w innych szablonach
+- Suita testów zielona
+- Wizualna weryfikacja w panelu admina OK
+
+
+
diff --git a/.paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md b/.paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md
new file mode 100644
index 0000000..ab40af7
--- /dev/null
+++ b/.paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md
@@ -0,0 +1,121 @@
+---
+phase: 20-category-edit-mojibake-fix
+plan: 01
+subsystem: admin-ui
+tags: [encoding, utf8, mojibake, admin-templates, polish-chars]
+
+requires:
+ - phase: none
+ provides: n/a
+
+provides:
+ - poprawne polskie znaki w labelkach formularza edycji kategorii
+ - pewność że pozostałe pliki admin/templates/, templates/, autoload/ są wolne od double-encoded UTF-8 mojibake
+
+affects: []
+
+tech-stack:
+ added: []
+ patterns:
+ - "Detekcja double-encoded UTF-8: grep `Ä[\\x{84}-\\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć|Ĺ„` znajduje pliki z mojibake"
+
+key-files:
+ modified:
+ - admin/templates/shop-category/category-edit.php
+
+key-decisions:
+ - "Fix tylko 1 plik (9 wystąpień) — żaden inny szablon w repo nie ma mojibake"
+ - "Podmiana całych słów zamiast generyczna `ć`→`ć` — unika fałszywych alarmów na przyszłość"
+ - "Brak migracji danych w DB (te są oddzielnym tematem — HTML entities w additional_text)"
+
+patterns-established:
+ - "Workflow detekcji mojibake: jeden grep regex pokrywa najczęstsze sekwencje Win-1252→UTF-8 double-encoding"
+
+duration: ~10min
+started: 2026-05-13T16:30:00Z
+completed: 2026-05-13T16:40:00Z
+---
+
+# Phase 20 Plan 01: Category edit mojibake fix — Summary
+
+**9 wystąpień double-encoded UTF-8 w `admin/templates/shop-category/category-edit.php` naprawione na poprawne polskie znaki; pozostałe szablony zweryfikowane jako wolne od mojibake.**
+
+## Performance
+
+| Metric | Value |
+|--------|-------|
+| Duration | ~10min |
+| Tasks | 3 z 3 wykonane |
+| Files modified | 1 |
+| Mojibake fixed | 9 wystąpień (7 unikalnych fraz) |
+| Total suite | 846 zielone (bez zmian) |
+
+## Acceptance Criteria Results
+
+| Criterion | Status | Notes |
+|-----------|--------|-------|
+| AC-1: Brak mojibake w pliku | Pass | grep mojibake → 0 wyników; file → UTF-8 bez BOM |
+| AC-2: Labelki renderują się z polskimi znakami | Pass | Human-verify approved przez użytkownika |
+| AC-3: Brak regresji w innych szablonach | Pass | grep w admin/templates/+templates/+autoload/ → 0 plików; suita 846 OK |
+
+## Accomplishments
+
+- Wykryto i naprawiono mojibake w jedynym dotkniętym pliku repo
+- Etykiety formularza edycji kategorii w panelu admina są czytelne po polsku ("Treść", "Język domyślny", "Sortowanie produktów", "Tytuł kategorii (h1)", "Blokuj indeksację", "Wyświetlić podkategorie", "Opis kategorii (rozwinięcie)")
+- Auto-upload FTP wysłał plik na produkcję; weryfikacja w przeglądarce potwierdzona
+
+## Files Created/Modified
+
+| File | Change | Purpose |
+|------|--------|---------|
+| `admin/templates/shop-category/category-edit.php` | Modified | Podmiana 9 wystąpień double-encoded UTF-8 na poprawne polskie znaki (7 unikalnych fraz: Treść, JÄ™zyk domyĹ›lny x2, rozwiniÄ™cie, Sortowanie produktĂłw, WyĹ›wietlić podkategorie, TytuĹ‚ kategorii, Blokuj indeksacjÄ™) |
+
+## Decisions Made
+
+| Decision | Rationale | Impact |
+|----------|-----------|--------|
+| Podmiana całych słów zamiast `ć`→`ć` itd. | Bezpieczniej — nie zostawia ryzyka uszkodzenia poprawnych fragmentów przy hipotetycznym przyszłym pojawieniu się tych bajtów w innym kontekście | Edits są precyzyjne, łatwe do code-review |
+| Fix tylko ten jeden plik | grep pokazał że to jedyny plik z mojibake w całym repo | Scope minimalny, brak ryzyka regresji |
+
+## Deviations from Plan
+
+### Summary
+
+| Type | Count | Impact |
+|------|-------|--------|
+| Auto-fixed | 0 | — |
+| Scope additions | 0 | — |
+| Deferred | 1 | Git commit transition-phase (pattern z faz 15-19) |
+
+**Total impact:** Plan wykonany dokładnie według planu.
+
+### Deferred Items
+
+- Transition-phase git commit dla Phase 20 — pattern z faz 15-19 (commit zrobi `/koniec-pracy` lub user manualnie). Brak negatywnego impactu — auto-upload FTP już ma plik na produkcji.
+
+## Issues Encountered
+
+None.
+
+## Next Phase Readiness
+
+**Ready:**
+- Pattern detekcji mojibake (regex) udokumentowany — przydatny przy przyszłych audytach encoding
+- Plik category-edit.php czysty UTF-8
+
+**Concerns:**
+- Inne pola w bazie (`additional_text` kategorii) mają mieszane HTML entities z polskimi znakami — oddzielny issue, nie blokuje
+- Brak automatycznego sprawdzania encoding w CI — przyszły fix mógłby wprowadzić nowy mojibake bez wykrycia
+
+**Blockers:** None.
+
+## Skill Audit (Phase 20)
+
+| Expected | Invoked | Notes |
+|----------|---------|-------|
+| /feature-dev | ○ | Triviany fix labelek — override per pattern poprzednich faz |
+| /koniec-pracy | ○ | Pending — uruchomić przy release update package |
+
+---
+*Phase: 20-category-edit-mojibake-fix, Plan: 01*
+*Completed: 2026-05-13*
diff --git a/admin/templates/shop-category/category-edit.php b/admin/templates/shop-category/category-edit.php
index 1c41f7d..0db5211 100644
--- a/admin/templates/shop-category/category-edit.php
+++ b/admin/templates/shop-category/category-edit.php
@@ -7,7 +7,7 @@ ob_start();
?>
- - Treść
+ - Treść
- Ustawienia
- SEO
@@ -17,7 +17,7 @@ ob_start();
if ( is_array( $this -> languages ) ): foreach ( $this -> languages as $lg ):?>
if ( $lg['status'] ):?>
- - if ( $lg['id'] == $this->dlang ) echo ' ';?>= $lg['name'];?>
+ - if ( $lg['id'] == $this->dlang ) echo ' ';?>= $lg['name'];?>
endif;?>
endforeach; endif;?>
@@ -45,7 +45,7 @@ ob_start();
);?>
= \Shared\Html\Html::textarea(
array(
- 'label' => 'Opis kategorii (rozwinięcie)',
+ 'label' => 'Opis kategorii (rozwinięcie)',
'name' => 'text_hidden[' . $lg['id'] . ']',
'id' => 'text_hidden_' . $lg['id'],
'value' => $this -> category['languages'][ $lg['id'] ]['text_hidden'],
@@ -84,7 +84,7 @@ ob_start();
);?>
= \Shared\Html\Html::select(
[
- 'label' => 'Sortowanie produktĂłw',
+ 'label' => 'Sortowanie produktów',
'name' => 'sort_type',
'id' => 'sort_type',
'values' => is_array( $this -> sort_types ) ? $this -> sort_types : [],
@@ -93,7 +93,7 @@ ob_start();
);?>
= \Shared\Html\Html::input_switch(
array(
- 'label' => 'Wyświetlić podkategorie',
+ 'label' => 'Wyświetlić podkategorie',
'name' => 'view_subcategories',
'checked' => $this -> category['view_subcategories'] == 1 ? true : false
)
@@ -104,7 +104,7 @@ ob_start();
if ( is_array( $this -> languages ) ): foreach ( $this -> languages as $lg ):?>
if ( $lg['status'] ):?>
- - if ( $lg['id'] == $this->dlang ) echo ' ';?>= $lg['name'];?>
+ - if ( $lg['id'] == $this->dlang ) echo ' ';?>= $lg['name'];?>
endif;?>
endforeach; endif;?>
@@ -124,7 +124,7 @@ ob_start();
);?>
= \Shared\Html\Html::input(
array(
- 'label' => 'Tytuł kategorii (h1)',
+ 'label' => 'Tytuł kategorii (h1)',
'name' => 'category_title[' . $lg['id'] . ']',
'id' => 'category_title_' . $lg['id'],
'value' => $this -> category['languages' ][ $lg['id'] ]['category_title']
@@ -156,7 +156,7 @@ ob_start();
);?>
= \Shared\Html\Html::select(
array(
- 'label' => 'Blokuj indeksacjÄ™',
+ 'label' => 'Blokuj indeksację',
'name' => 'noindex[' . $lg['id'] . ']',
'id' => 'noindex_' . $lg['id'],
'values' => array(