v0.34.0 - Krok 23 etapy 4-8: LICENSE, readme.txt i zgodnosc dokumentacji z kodem
v0.34.0 — Krok 23 etapy 4–8: testy obciążeniowe, cykl życia na żywo, zgodność dokumentacji, licencja
Wydanie spina cztery etapy Kroku 23, które siedziały dotąd w drzewie bez tagu (etapy 4 i 5)
albo powstały teraz (7 i 8). Bez zmian schematu bazy — AIFAQ_DB_VERSION zostaje '6'.
AIFAQ_VERSION 0.33.0 → 0.34.0.
v1.0.0 świadomie NIE jest tym wydaniem. Numer 1.0.0 zostaje zarezerwowany na domknięcie
po audycie (etap 9), który właściciel projektu odłożył do własnego sygnału.
Nowe pliki: LICENSE i readme.txt (etap 8)
Repozytorium nie miało dotąd ani jednego z nich.
LICENSE— dosłowny tekst GNU GPL v2, 339 linii. Nie generowany, tylko wycięty
zlicense.txtrdzenia WordPressa, z pominięciem nagłówka WordPressa i jego sekcji
„WRITTEN OFFER". Struktura zweryfikowana: preambuła, TERMS AND CONDITIONS, sekcje 0–11,
NO WARRANTY, aneks „How to Apply These Terms".readme.txt— dokument dla klienta, nie dla katalogu WordPress.org: polska proza
przy angielskich nazwach sekcji, bez pólContributors,Donate linkiTags.
Zawiera trzy ujawnienia, które odbiorca musi znać przed instalacją: co dokładnie leci
do Google Gemini, model BYOK (wtyczka nie zawiera klucza i bez niego nie działa) oraz
dziennik pytań z hashem IP przy domyślnie wyłączonej retencji.
Licencja: GPLv2 bez klauzuli „or later" — decyzja właściciela projektu. Zapis ujednolicony
w nagłówku wtyczki i w readme.txt; wcześniej nagłówek niósł GPL-2.0-or-later. Sam plik
LICENSE jest w obu wariantach identyczny — różnicę niesie nota udzielenia w nagłówku
programu, i tam została zapisana. Nota copyright: Copyright (C) 2026 mtsle.
Kod stron trzecich: brak. assets/ wylistowane fizycznie — 5 plików CSS, 7 JS, 3 zaślepki
index.php, zero bibliotek, fontów i ikon. GPL obejmuje całość bez wyjątków.
Zgodność README z kodem (etap 7, „Kompatybilność Batch")
Całe README zderzone zdanie po zdaniu z wykonywalnym kodem: 107 twierdzeń, z czego
8 mijało się z implementacją. Wszystkie naprawione po stronie dokumentacji — zero zmian
w kodzie produkcyjnym w tym etapie.
Najpoważniejsze trzy:
- Tabela uprawnień obiecywała Redaktorowi i Autorowi ekran „Narzędzie FAQ", który
rejestruje się naMenu::CAPABILITY=manage_options. Redaktor ma trasy REST i metabox,
ale ekranu w kokpicie nie zobaczy. Sprawdzenie intencji przed poprawką okazało się
kluczowe:tests/krok20-capy-test.phptrzyma asercję „Menu::CAPABILITYnietknięte",
czyli to była decyzja kontraktu Kroku 20 — poprawka poszła w README, nie w kod. - Liczba filtrów rozszerzeń zaniżona: 19 zamiast 24. Pięć filtrów nigdy nie trafiło do
dokumentacji:aifaq_tool_capability,aifaq_security_headers,aifaq_jsonld_node,
aifaq_widget_heading,aifaq_nocache_for_owner. - „Ścieżka administratora nie jest limitowana… nie jest przez niego blokowany" — nieprawda.
AniRagService::budget_allows(), aniRateLimiter::allow()nie mają zwolnienia dla
manage_options; właściciel pytający z panelu jest odbijany identycznie jak gość.
Rozstrzygnięcie właściciela projektu: zawęzić README, kodu nie ruszać — sufit chroni
darmową pulę Gemini i zwolnienie właściciela psułoby generator gościom.
Pozostałe pięć: zasięg filtra aifaq_tool_capability, fallback CSP na unsafe-inline przy
pustym nonce, „kaskada czterech źródeł" (są trzy źródła + filtr balastu), etykiety przycisków
w tabeli stanów podstrony, rozmiar RestController.
Testy obciążeniowe (etap 4) — dwie poprawki zmierzone BEFORE/AFTER
- Blokada ponownego indeksowania była TOCTOU. Przy 10 równoległych procesach
3 z 10 zdobywały ją jednocześnie. Naprawione wzorcemadd_option()→ 1/10,
potwierdzone pomiarem. - Paginacja Historii i Generacji bez pasującego indeksu —
ORDER BY created_at DESC, id DESC
na samymKEY created_atwymuszał filesort. DodanyKEY created_id (created_at,id)
w obu tabelach: do 31× szybciej przy 20 000 wierszy.
Potwierdzone i świadomie nienaprawione: Retriever liczy podobieństwo liniowo (brak ANN) —
płasko do 50 000 fragmentów, ale 5,8 s na pytanie przy tej skali; od etapu 5 wtyczka ostrzega
w kokpicie po przekroczeniu 5000 fragmentów.
Cykl życia produktu na żywo (etap 5) — 151 asercji, wsad 8 napraw
Przejście całego życia wtyczki na ai-faq-dev.local z realnym Gemini. Dwa błędy znalezione
w przejściu, oba z dowodem A/B:
uninstall.phpzdejmował jeden z dwóch cronów —aifaq_reindex_continuezostawał
w bazie klienta. Przyczyna przeoczenia: strażnik uninstall pilnował opcji, meta i transientów,
a cronów nie sprawdzał wcale. Dopisany skan.- Skutki uboczne zapisu ustawień siedziały w
if ( is_admin() )— WP-CLI, przywracanie
kopii bazy i zapis programowy nie podnosiły flagi przebudowy adresów, więc nowy slug
dawał 404 bezterminowo.
Z wsadu napraw najważniejszy zamek publikacji FAQ: pięć równoczesnych publikacji gubiło
trzy bez śladu (także z kopii zapasowej, bo nadpisywała się razem z danymi). Teraz drugie
żądanie dostaje HTTP 409 zamiast cichego nadpisania.
Odbiór
- Runner
zasoby/run-tests.sh: 60/60, zero niezaliczonych. php -lczysto na zmienionymai-faq-generator.php.- Potrójna zgodność nagłówków
ai-faq-generator.php↔readme.txt↔README.md
(licencja,License URI, wersja, wymagania) udowodniona cytatami w raporcie etapu 8. - Budżet API: 0 wywołań Gemini w etapach 7 i 8 (oba w całości statyczne).
Raporty
plany/raporty/KROK23-ETAP7-KOMPATYBILNOSC.md · plany/raporty/KROK23-ETAP8-LICENCJA.md ·
plany/raporty/LOAD-TEST-REPORT.md · plany/raporty/KROK23-ETAP5-WHILE-REPORT.md
(wszystkie poza repozytorium wtyczki, w katalogu roboczym projektu).
Stan Kroku 23
Etapy 1–8 zrobione. Etap 9 (audyt) odłożony na sygnał właściciela projektu — świadoma
decyzja, nie pominięcie. Etap 10 (domknięcie → v1.0.0) po audycie.