Skip to content

v0.34.0 - Krok 23 etapy 4-8: LICENSE, readme.txt i zgodnosc dokumentacji z kodem

Choose a tag to compare

@mtsle mtsle released this 03 Aug 20:56
· 97 commits to main since this release

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 bazyAIFAQ_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
    z license.txt rdzenia 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ól Contributors, Donate link i Tags.
    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:

  1. Tabela uprawnień obiecywała Redaktorowi i Autorowi ekran „Narzędzie FAQ", który
    rejestruje się na Menu::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.php trzyma asercję „Menu::CAPABILITY nietknięte",
    czyli to była decyzja kontraktu Kroku 20 — poprawka poszła w README, nie w kod.
  2. 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.
  3. „Ścieżka administratora nie jest limitowana… nie jest przez niego blokowany" — nieprawda.
    Ani RagService::budget_allows(), ani RateLimiter::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 wzorcem add_option() → 1/10,
    potwierdzone pomiarem.
  • Paginacja Historii i Generacji bez pasującego indeksuORDER BY created_at DESC, id DESC
    na samym KEY created_at wymuszał filesort. Dodany KEY 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.php zdejmował jeden z dwóch cronówaifaq_reindex_continue zostawał
    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 -l czysto na zmienionym ai-faq-generator.php.
  • Potrójna zgodność nagłówków ai-faq-generator.phpreadme.txtREADME.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.