# BRIEF dla codex1 — prompt produkcyjny „SCENOGRAF v2" (gramatyka komponentów + kotwice)

> Autor briefu: Claude (sesja 2026-08-28, sandbox `misc/identyfikacja_yt`). Zgodnie z doktryną:
> prompt produkcyjny pisze **wyłącznie codex1**; ten dokument to kompletna specyfikacja zadania.
> Docelowy plik promptu: najpierw sandbox `misc/identyfikacja_yt/fabryka/prompty/SCENOGRAF_V2.md`,
> po zielonym teście — `misc/wytwornia/prompty/` (świadoma kaskada: zmiana promptu przelicza
> LLM+render w dół; to decyzja usera, nie codexa).

## 1. Cel i kontekst (przeczytaj zanim napiszesz pierwszą linię)

Scenograf v1 zwracał `tytul + punkty[]` — silnik renderował z tego jedną, stałą planszę
(stąd „stylistyczna bieda"). W v2 scenograf staje się **reżyserem danych**: dla każdej sceny
wybiera JEDEN typ planszy z gramatyki 12 komponentów i wypełnia go danymi + **kotwicami**
(słowo lektora, na którym element wchodzi na ekran). CAŁA reszta — kolory, fonty, layout,
animacje, napisy — należy do kodu (composer + skin). Scenograf **nie zna skinu** i nie może
się do niego odwoływać; akcenty wybiera z abstrakcyjnych nazw slotów.

Pipeline (sandbox, działa od 2026-08-28): `film.json` → `fabryka/generuj.mjs` → TTS (Kokoro,
timestampy słów) → klatki z komponentów → render. Dowód: 20 filmów `videos/f01…f20`.
Prompt v2 ma produkować dokładnie środek tego łańcucha: obiekt zgodny ze schematem
`fabryka/plansze-v2.schema.json` (schemat jest w KODZIE etapu i podawany przez most LLM —
NIE wklejaj go do promptu; prompt opisuje gramatykę po ludzku).

## 2. Wejście promptu

Placeholder `«SCENARIUSZ»` (jak w v1). Scenariusz to sceny w formacie:

```
[s03]
LEKTOR: ChatGPT Pro — two hundred. Claude Max — two hundred. Cursor Ultra — one ninety-two. Every single month.
PLAN: porównaj ceny trzech abonamentów; podkreśl powtarzalność kosztu
```

Lektor bywa polski albo angielski — prompt ma działać dla obu bez zmian.

## 3. Wyjście — kontrakt (opisz w prompcie, schemat wymusza kod)

Jeden obiekt JSON: `{"plansze":[ … ]}`, jedna plansza na scenę, w kolejności scen.
Pola wspólne każdej planszy: `scena` (id ze scenariusza), `typ` (enum niżej), `kicker`
(mikro-nagłówek, patrz reguły), `akcent` (nazwa slotu koloru), opcjonalnie `przejscie`
(enum rejestru; scena 1 zawsze `cut`; domyślnie `crossfade`). Pozostałe pola — WYŁĄCZNIE
te należące do wybranego `typ` (schemat jest płaski i nie wymusi tego sam — kod flaguje
pola spoza typu; prompt musi tego zakazać wprost).

Sloty akcentów: `green orange purple yellow blue red pink cyan cream` — to NAZWY, nie
kolory; skin mapuje je po swojemu. Jeden akcent na scenę (wyjątki: `bar-rows`, `wezly`,
`karty`, `punkty`, `wiersze`, `gauges`, `linie` — tam wolno różnicować per element).

## 4. Gramatyka 12 typów — kiedy który (serce promptu)

| `typ` | Użyj, gdy PLAN sceny… | Pola typu (dokładne nazwy) |
|---|---|---|
| `title-card` | otwiera temat / stawia hasło / domyka sekcję | `tytul` (może zawierać `<b>…</b>` na 1 frazie), `sub?`, `podkreslenie?`, `tytul_kotwica`, `sub_kotwica?` |
| `hero-stat` | jedna liczba jest bohaterem | `stat{prefix?,do,suffix?,sep?,kotwica}`, `pill?{tekst,do?,prefix?,suffix?,kotwica}`, `subline?{tekst,kotwica}`, `annot?{tekst,kotwica}` |
| `bar-rows` | porównuje 2–5 wielkości tego samego rodzaju | `rows[]{label,nota?,do,prefix?,sufiks?,pct,akcent,kotwica}` — `pct` = szerokość paska 5–100, proporcjonalna do `do` względem maksimum |
| `chart-threshold` | wielkość rośnie w czasie i PRZECINA próg | `badge?{tekst,akcent?,kotwica}`, `osie_kotwica`, `maxX`, `maxY`, `os_x?`, `prog{wartosc,label,akcent?,kotwica}`, `linia{na_miesiac,do_x,kotwica}`, `cross{label,kotwica}` — matematyka MUSI się zgadzać: przecięcie = `prog.wartosc / linia.na_miesiac ≤ maxX`, `linia.do_x·na_miesiac ≤ maxY` |
| `flow` | proces / łańcuch przyczynowy 2–6 kroków | `wezly[]{tekst,cap?,akcent?,kotwica}`, `podsumowanie?{tekst,kotwica}` |
| `verdict-stack` | wnioski + jedna puenta | `checks[]{tekst,kotwica}` (1–3), `pill?{tekst,ikona?,kotwica}`, `payoff{html,kotwica}` (`<b>` na 1 słowie) |
| `cards-list` | listicle równorzędnych pozycji 2–4 | `karty[]{tytul,sub,akcent?,kotwica}` |
| `timeline` | chronologia 3–6 momentów | `punkty[]{tekst,rok?,akcent?,kotwica}` |
| `compare` | dwie opcje ważone naraz | `lewa{tytul,punkty[1–4],akcent,kotwica}`, `prawa{…}`, `werdykt?{tekst,akcent?,kotwica}` |
| `leaderboard` | ranking z wynikami liczbowymi | `wiersze[]{nazwa,wynik,akcent?,kotwica}` (2–6, malejąco po `wynik`) |
| `markers` | podkreśla pojedyncze SŁOWA w krótkich frazach | `linie[]{przed?,slowo,po?,marker:highlight\|kolo\|scribble,akcent?,kotwica}` |
| `ring-gauges` | 2–3 metryki procentowe/stanowe | `gauges[]{label,pct,do,prefix?,suffix?,akcent,kotwica}` (`pct` = wypełnienie łuku 0–100) |

Reguła wyboru: intencja z PLANU → typ; przy remisie preferuj typ z danymi liczbowymi nad
czysto tekstowy. Sekwencja scen powinna zmieniać typy (nie dwa razy z rzędu ten sam, chyba
że PLAN wyraźnie kontynuuje tę samą planszę).

## 5. Kotwica — definicja (najważniejszy pojedynczy koncept)

`kotwica` = **jedno słowo skopiowane dosłownie z linii LEKTORA TEJ sceny**, wskazujące moment
wejścia elementu. Kod matchuje case-insensitive, po odcięciu interpunkcji, prefiksowo, i bierze
**pierwsze** wystąpienie — więc prompt musi wymagać: (a) słowo istnieje w tej linii lektora,
(b) jest możliwie unikalne w linii (nie „the"/„i"/„a"), (c) elementy sceny mają kotwice w
KOLEJNOŚCI wypowiadania. Gdy element nie ma naturalnego słowa — pomiń pole `kotwica` tam,
gdzie schemat pozwala (kod rozłoży wejście równomiernie) — ale to wyjątek, nie norma.
Uwaga na liczby: TTS normalizuje zapis („two hundred" ↔ „$200") — bezpieczniej kotwiczyć na
słowach nie-liczbowych sąsiadujących z liczbą.

## 6. Reguły redakcyjne do zakodowania w prompcie

1. **Plansza to mapa, nie transkrypcja** (dziedziczone z v1): zero kopiowania zdań lektora;
   etykiety ≤ ~40 znaków, hasłowe; dosłownie wolno przenieść tylko terminy, liczby i nazwy.
2. **Liczby wyłącznie ze scenariusza** — żadnego dopowiadania wartości, procentów, dat.
   Brak liczby w źródle ⇒ nie wybieraj typu liczbowego.
3. `kicker`: 2–5 słów, UPPERCASE nieznaczący (kod formatuje), bez kropki; nazywa sekcję/temat
   sceny, nie streszcza lektora.
4. `<b>` dozwolone WYŁĄCZNIE w `tytul` i `payoff.html`, na jednej frazie; żadnego innego HTML.
5. Pola spoza wybranego `typ` — zakazane (kod je zflaguje, ale prompt ma nie pozwolić).
6. Spójność arytmetyki w `chart-threshold` i monotoniczność w `leaderboard` (patrz §4).
7. `pct` w `bar-rows`: największa wartość = 90–100, reszta proporcjonalnie (zaokrąglaj).
8. Odpowiedź: WYŁĄCZNIE JSON zgodny z opisem, bez markdownu, bez komentarzy, bez pytań —
   wątpliwości treściowe rozstrzygaj samodzielnie (flagi są po stronie kodu, potok nie staje).

## 7. Złote przykłady (wklej do promptu 2–3 z tych, skrócone wg uznania)

Wejście:
```
[s03]
LEKTOR: ChatGPT Pro — two hundred. Claude Max — two hundred. Cursor Ultra — one ninety-two. Every single month.
PLAN: porównaj ceny trzech abonamentów; podkreśl powtarzalność
```
Wyjście (fragment `plansze[]`):
```json
{ "scena": "s03", "typ": "bar-rows", "kicker": "PER MONTH", "akcent": "green",
  "przejscie": "push-slide LEFT",
  "rows": [
    { "label": "ChatGPT Pro", "nota": "highest usage tier", "do": 200, "prefix": "$", "sufiks": "/month", "pct": 96, "akcent": "green",  "kotwica": "ChatGPT" },
    { "label": "Claude Max",  "nota": "20x tier",           "do": 200, "prefix": "$", "sufiks": "/month", "pct": 96, "akcent": "orange", "kotwica": "Claude" },
    { "label": "Cursor Ultra",                              "do": 192, "prefix": "$", "sufiks": "/month", "pct": 92, "akcent": "purple", "kotwica": "Cursor" } ] }
```

Wejście:
```
[s02]
LEKTOR: Your browser asks a resolver. The resolver asks the root, then the registry — and back comes the IP address.
PLAN: pokaż łańcuch zapytania DNS krok po kroku
```
Wyjście:
```json
{ "scena": "s02", "typ": "flow", "kicker": "THE LOOKUP", "akcent": "yellow",
  "wezly": [
    { "tekst": "you",        "cap": "browser",    "akcent": "yellow", "kotwica": "browser" },
    { "tekst": "resolver",   "cap": "ISP",        "akcent": "pink",   "kotwica": "resolver" },
    { "tekst": "root",                            "akcent": "blue",   "kotwica": "root" },
    { "tekst": "registry",   "cap": ".com TLD",   "akcent": "green",  "kotwica": "registry" },
    { "tekst": "IP address", "cap": "answer",     "akcent": "red",    "kotwica": "address" } ] }
```

Anty-przykłady (pokaż 1–2 w prompcie jako ZŁE):
- ZŁE: `"label": "Cursor Ultra kosztuje sto dziewięćdziesiąt dwa dolary miesięcznie"` —
  parafraza zdania lektora zamiast etykiety.
- ZŁE: `"prog": {"wartosc": 150, …}` gdy scenariusz nie wymienia żadnego progu — zmyślona liczba.
- ZŁE: `"kotwica": "the"` — słowo nieunikalne; oraz kotwica słowem, którego nie ma w tej linii.

## 8. Podział odpowiedzialności (żeby prompt nie robił roboty kodu)

Kod (composer + walidacja etapu) GWARANTUJE: matchowanie kotwic z fallbackiem na frakcje
czasu + flaga `kotwica_nie_znaleziona`; mapowanie slotów akcentów na skin (nieznany slot →
pierwszy akcent skinu); layout, typografia, easing, napisy, keep-out; flagi za pola spoza
typu, `pct` poza 5–100, niemonotoniczny leaderboard, arytmetykę chart-threshold. Prompt NIE
opisuje kolorów, fontów, animacji ani czasu trwania scen (czas = długość głosu, zawsze).

## 9. Parametry techniczne dla codex1

- Język promptu: polski (jak SCENARZYSTA/SCENOGRAF v1); przykłady mogą być angielskie.
- Placeholder wejścia: `«SCENARIUSZ»` na końcu promptu, jak w v1.
- Schemat odpowiedzi podaje most LLM z pliku `fabryka/plansze-v2.schema.json` — słownik
  schematu ograniczony do udowodnionego produkcyjnie (`enum`, `minItems/maxItems`,
  `additionalProperties:false`; celowo BEZ `oneOf` i BEZ `maxLength` — limity długości
  egzekwuje prompt, wariantowość typów egzekwuje prompt + flagi kodu).
- Objętość: prompt ma być zwarty; gramatykę z §4 wolno skompresować, ale każda nazwa pola
  musi pozostać DOSŁOWNA (composer czyta te klucze 1:1).
- Definition of done: (1) na scenariuszu testowym z sandboxa (`videos/f02…f05/film.json`
  potraktowanych jako złote wyjścia) prompt odtwarza sensowne plansze bez pól spoza typu,
  (2) zero markdownu w odpowiedzi, (3) kotwice istnieją w liniach lektora. Test uruchamia
  user w sandboxie zanim cokolwiek trafi do wytwórni.

---

## ERRATA v2.1 (po teście f22 + analizie 3 filmów kanału, 2026-08-28 noc)

Do uwzględnienia przy następnej redakcji promptu przez codex1:

1. `ikona` (pill/puenta) = POJEDYNCZY GLIF (np. ✓ ✗ ✎ ⏱), nigdy słowo — w f22
   LLM wpisał "check" i wyrenderowało się jako tekst.
2. Nowe pola (schemat już je ma): plansza może mieć `puenta{tekst,ikona?,akcent?,kotwica}`
   — dolny dashed-callout domykający scenę (u RepoChada zamyka większość scen danych;
   zalecaj go dla bar-rows/cards-list/leaderboard, gdy lektor kończy wnioskiem);
   `karty[]`/`wiersze[]` mogą mieć `wyroznij:true` (zwycięzca → zielony glow + badge)
   i `karty[]` `odrzuc:true` (pułapka → ✗ + przygaszenie); `lewa`/`prawa` w compare
   mogą mieć `badge` (krótki chip, np. "FINE" / "A WALL").
3. Semantyka akcentów (miękka wskazówka doboru): red=koszt/problem, green=wygrana/tanio,
   cyan=produkt, yellow=konkurent/uwaga, orange=trade-off, purple=sprzęt/wagi, pink=trening.
4. Napisy karaoke są OPCJĄ pipeline'u (flaga filmu), nie decyzją scenografa — bez zmian
   w prompcie; wpis dla porządku.

5. `cards-list`: karta specyfikacji/opcji powinna nieść WNĘTRZE — 2–3 `punkty[]`
   ({tekst, zn: "v"|"x"|"-"}) i krótką `stopka`; karta z samym tytułem i podpisem
   renderuje się mniejsza (nie wypełnia pasa) — używaj tylko dla szybkich wyliczanek.

## ERRATA v2.2 (po f22 v12 — monotonia typów, 2026-08-29)

6. `verdict-stack.checks[]` ma teraz pole `zn: "v"|"x"|"-"` (schemat zaktualizowany):
   znak MUSI zgadzać się z semantyką zdania — "can load" → "v", "cannot load"/
   "fails"/negacja → "x", fakt neutralny → "-". W f22 LLM dał ✓ przy "cannot load".
7. RÓŻNORODNOŚĆ — **TYMCZASOWE, TRYB TESTOWY** (decyzja usera 2026-08-29:
   "to tymczasowe, żeby wszystkie prezentował — dla testów, a nie jako stały
   wymóg"). Twardy mandat "N plansz = N różnych typów / zero powtórek w
   sąsiednich" obowiązuje TYLKO w runach testowych (pipeline wymusza go flagą
   `--wymus-roznorodnosc` w scenograf_run.py — retry poza promptem). Przy
   NASTĘPNEJ redakcji promptu: mandat zmiękczyć do wskazówki ("unikaj monotonii,
   dwa identyczne typy pod rząd to zwykle błąd rozkładu"), a NA STAŁE zostają
   heurystyki treść→typ:
   - próg/limit/"mieści się czy nie" (np. model 111.6GB vs RAM 96/128GB) → **chart-threshold**;
   - wyliczenie 3+ wartości liczbowych jednej wielkości (np. 96/256/512GB) → **bar-rows**;
   - ranking/porównanie wielu pozycji → **leaderboard**;
   - proces/sekwencja/przyczyna→skutek → **flow** lub **timeline**;
   - udziały %/wykorzystanie → **ring-gauges**;
   - dokładnie 2 opcje twarzą w twarz → **compare** (raz na film, chyba że różne osie);
   - jedna dominująca liczba → **hero-stat**; werdykt końcowy → **verdict-stack**;
   - **title-card oszczędnie** (intro/rozdział), nigdy gdy lektor niesie ≥2 liczby.
8. Gdy lektor sceny niesie ≥2 liczby, typ MUSI być typem danych (bar-rows/
   chart-threshold/ring-gauges/leaderboard/hero-stat/compare), nie plakatem.

## ERRATA v2.3 (schemat rozszerzony 12→21 typów, 2026-08-29)

9. PEŁNA PALETA. User wytknął, że scenograf znał tylko 12 z 22 builderów
   fabryki — to była wada schematu, nie decyzja. Schemat zna teraz 21 typów
   (poza nim tylko meta-plansza caption-specimens). Prompt MUSI opisać 9 nowych
   typów z heurystykami użycia (pola dokładnie wg schematu — uwaga na aliasy):
   - **tier-header** (`etykieta`+`tytul`+`sub`): separator rozdziału — gdy lektor
     otwiera nową część wywodu ("part one", "now the", zmiana tematu).
   - **product-card** (`karta{tytul,sub,badge}`+`annot`+`pill`): przedstawienie
     produktu/obiektu — karta z glow, odręczna adnotacja nad nią.
   - **prop-card** (`tytul_karty`+`podpis`+`slupki[3–7 liczb]`+`wyroznij` indeks):
     mikro-wykres słupkowy w karcie — mała seria danych z jednym zwycięzcą.
   - **type-beats** (`beaty[2–4]{tekst}`+`payoff{html,kotwica}`): kinetyczna
     mantra — krótkie hasła uderzane po kolei, payoff na koniec (mocna teza,
     powtórzenie, rada). Renderer zdejmie <b> z payoff.
   - **terminal** (`komendy[]{typ:"cmd"|"out",tekst}`): demo w terminalu —
     komenda i jej wynik, idealne na błędy ("cannot load", limity, logi).
   - **glitch-hit** (`slowo`+`sub`): jedno słowo-cios z glitchem + podpis —
     moment szoku, pojedyncza liczba-skandal, twarde "NIE".
   - **camera-world** (`stacje[3]{tytul,sub,akcent}`): kamera jedzie po 3
     stacjach — filary/etapy/kryteria wywodu.
   - **before-after** (`przed{tag,tekst,sub}`+`po{...}`): transformacja —
     kontrast dwóch stanów (było/jest, drożej/taniej, pada/działa).
   - **sampler-stat** (`do`+`suffix`+`label`+`pct`): jeden wielki licznik
     z pierścieniem — pojedyncza dominująca metryka sceny.
   Heurystyki z pkt 7 pozostają; nowe typy WCHODZĄ do rotacji różnorodności.

## ERRATA v2.4 (porządek z doborem typów, 2026-08-29)

10. GRAWITACJA BEZPIECZNYCH TYPÓW — zdiagnozowana klasa błędu: mimo opisania
    21 typów scenograf w pierwszym podejściu używał 5 (hero-stat ×7 na 20
    plansz) i dopiero zewnętrzny retry z listą nieużytych dawał różnorodność.
    Opis typów NIE wystarcza. Prompt MUSI narzucać PROCEDURĘ doboru — dobór
    typów jako jawny krok PRZED pisaniem plansz, w tej kolejności:
    a) Przejdź po scenach i najpierw obsadź typy SYGNAŁOWE tam, gdzie treść
       niesie ich sygnał (to one robią film): terminal (komenda/błąd/log),
       before-after (kontrast stanów), glitch-hit (słowo-cios), camera-world
       (dokładnie 3 filary), type-beats (mantra/powtórzenie), sampler-stat
       (jedna dominująca liczba), timeline (sekwencja w czasie), leaderboard
       (ranking), ring-gauges (udziały), markers (podkreślenia zdań),
       tier-header (otwarcie rozdziału), product-card (przedstawienie
       produktu), prop-card (mała seria słupków).
    b) Dopiero POTEM wypełnij pozostałe sceny typami roboczymi (bar-rows,
       compare, hero-stat, cards-list, chart-threshold, flow, verdict-stack,
       title-card).
    c) LIMITY twarde: hero-stat ≤2 na film; żaden typ w sąsiednich planszach;
       title-card tylko intro/rozdział. Typ roboczy wolno użyć tylko, jeśli
       żaden typ sygnałowy nie pasuje lepiej.
    Ta procedura obowiązuje ZAWSZE (produkcyjnie też) — to nie jest tryb
    testowy; tryb testowy (--wymus-roznorodnosc) jedynie podnosi cel liczby
    unikalnych typów. Zewnętrzny retry w scenograf_run zostaje NA STAŁE jako
    bezpiecznik, ale ma być rzadko potrzebny — miarą jakości promptu jest
    różnorodny rozkład W PIERWSZYM podejściu.

11. MINIMA WNĘTRZ (druga klasa tej samej choroby: LLM daje chude wnętrza —
    audyt f25 zgłosił 5 pustawych scen). Kadr ma być bogaty jak wzorzec
    (doktryna: KISS nie dotyczy designu). Prompt MUSI podać TWARDE minima
    per typ — plansza poniżej minimum jest błędna:
    - leaderboard: ≥3 wiersze (2 pozycje to compare, nie ranking);
    - bar-rows: ≥3 rzędy;
    - cards-list: ≥2 karty, a karty niosą WNĘTRZE (2–3 punkty[] każda ORAZ
      stopka; jedna karta = to nie lista, użyj product-card);
    - compare: każda strona ≥3 punkty + badge + stopka;
    - flow: ≥4 węzły; timeline: ≥3 punkty; ring-gauges: ≥2 wskaźniki;
    - verdict-stack: ≥2 checki + pill;
    - chart-threshold i bar-rows: gdy scena domyka myśl wnioskiem, DODAJ
      globalną puentę (dolny pas kadru nie może zostać martwy — u wzorca
      sceny danych kończą się dashed-calloutem).
    Zasada ogólna: jeśli lektor nie niesie dość danych na minimum typu,
    to znak, że wybrany typ jest ZŁY — wróć do procedury z pkt 10 i wybierz
    typ, którego minimum ta scena udźwignie.

12. JĘZYK PLANSZ (regres w v2.4 — angielski lektor dostał polskie plansze:
    "Koszt subskrypcji" nad napisami "The $5,499 base Ultra cannot"):
    WSZYSTKIE teksty plansz (kickery, tytuły, etykiety, punkty, puenty,
    badge, payoffy) MUSZĄ być w języku LEKTORA scenariusza — instrukcje
    promptu są po polsku, ale to metajęzyk, nie język treści. Prompt ma
    zawierać jawną regułę: "pisz plansze w języku, w którym napisany jest
    LEKTOR" i przykładowe teksty plansz podawać w języku lektora.

## ERRATA v3.0 (odchudzenie wg recenzji codexa, 2026-08-29)

13. Recenzja promptu v2.5 (fabryka/e2/recenzja_prompt.md, wykonana przez codex)
    wykazała: rdzeń (sygnał→typ, kontrakty pól, twarde minima strukturalne,
    kotwice, liczby tylko ze źródła) DZIAŁA i zostaje; tnie się TRZYKROTNE
    opowiadanie tych samych kryteriów, a reguły ilościowe zamienia w
    preferencje. Przepisz prompt OD NOWA wg szkieletu z recenzji
    (cel długości: 7–8.5k znaków):
    a) Rola + format odpowiedzi: bez zmian merytorycznych; JEDEN blok
       wyłączeń kompetencji (teraz są dwa niemal identyczne).
    b) ZASADA NADRZĘDNA (nowa, umieść wysoko, brzmienie dosłowne):
       "Różnorodność jest celem drugorzędnym. Nie wybieraj słabszego
       semantycznie typu tylko po to, by spełnić limit wystąpień. Trafność
       przed różnorodnością; brak danych na minimum typu → zmień typ,
       nigdy nie dopisuj treści spoza scenariusza."
    c) JEDNA tabela 21 typów: `typ | kiedy wybrać (sygnał) | pola | twarde
       minimum` — likwiduje osobne listy sygnałowe/robocze ORAZ sekcję
       "heurystyki nadrzędne" (wszystko w jednym miejscu, jeden raz).
    d) USUŃ CAŁKOWICIE regułę "≥2 liczby w lektorze → typ danych" (dwie
       liczby bywają wersją, datą, kodem błędu — reguła wymuszała fałszywe
       wykresy i wykluczała timeline/terminal/prop-card/sampler-stat).
    e) ZMIĘKCZ do preferencji (bez twardych limitów): powtórzenia typów —
       zakaz dopiero TRZECH identycznych z rzędu (dwa sąsiednie dozwolone,
       gdy treść tego chce, np. dwa równoległe bar-rows); hero-stat i
       title-card "oszczędnie, zwykle ≤2"; compare ile scen naprawdę jest
       pojedynkami; kicker 1–6 słów; język lektora Z WYJĄTKIEM nazw
       własnych, komend i cytowanych sloganów; chart-threshold także dla
       spadku do progu albo zbliżenia bez przecięcia.
    f) MINIMA skorygowane (redakcyjne w dół, strukturalne bez zmian):
       flow ≥3 węzły; karty w cards-list 1–3 punkty, `sub`/`stopka`
       OPCJONALNE; compare 2–4 punkty na stronę, `badge`/`stopka` OPCJONALNE;
       ring-gauges 2–4; verdict-stack: payoff obowiązkowy, `pill` OPCJONALNY;
       glitch-hit: słowo LUB bardzo krótka fraza. Bez zmian: leaderboard ≥3,
       bar-rows 3–5, timeline 3–6, type-beats 2–4, camera-world =3,
       before-after =2, compare =2 opcje.
    g) ZŁOTY PRZYKŁAD do naprawy: obecny dopisuje fakty spoza lektora
       ("highest usage tier", "20x tier") łamiąc własny zakaz — usuń noty
       albo oprzyj je jawnie na PLAN. Wystarczy JEDEN złoty przykład
       + JEDEN anty-przykład (para "źle → dobrze").
    h) Rozstrzygnij niespójność "limit": terminal = limit pokazany JAKO
       komenda/błąd/log; chart-threshold = limit jako wartość zbliżająca
       się do progu w czasie.

14. KOREKTA 13b (pomiar v3 z 2026-08-29 pokazał regres 1. podejścia:
    10 typów, product-card ×4, karty bez żadnego wnętrza — grawitacja
    przeniosła się na inny typ po zdjęciu limitu hero-stat):
    a) Przy zasadzie nadrzędnej dodaj JEDNĄ linijkę uogólnionego limitu
       miękkiego: "Każdy typ zwykle występuje najwyżej 2 razy w filmie;
       przekrocz tylko, gdy treść naprawdę tego wymaga."
    b) Opcjonalność `sub`/`stopka`/`punkty` w kartach NIE oznacza kart
       pustych: "karta bez żadnego wnętrza (ani jednego punktu, ani
       stopki) jest błędna — daj ≥1 punkt LUB stopkę".
    Reszta erraty 13 bez zmian.

## ERRATA v3.1 (nowe typy P1 z analizy OXZ14OErwOw, 2026-08-29)

15. Schemat rozszerzony do 24 typów — do tabeli typów dopisz trzy NOWE
    (wszystkie sygnałowe, wysoki priorytet doboru, bo niosą mocne metafory):
    - **capacity-bar** — sygnał: "mieści się czy nie", budżet pojemności,
      "x z y zajęte", model vs RAM. Pola: `paski[1–3]{label, logo?,
      pojemnosc, sufiks?, kotwica?, segmenty[1–4]{label, wartosc, akcent?,
      kotwica?}, tag?{tekst, akcent?, wariant?("dashed"|"solid"), kotwica?}}`
      + globalna `puenta`. Suma `wartosc` segmentów MOŻE przekraczać
      `pojemnosc` — wtedy renderer rysuje OVERFLOW wystający poza pasek
      (to jest cała pointa: pokazać "nie mieści się" dosłownie). `tag` to
      głos autora: dashed = komentarz ("fits — barely"), solid = werdykt
      ("does not fit"). Preferuj capacity-bar nad chart-threshold, gdy
      chodzi o POJEMNOŚĆ (statyczny budżet), a chart-threshold gdy wartość
      ROŚNIE W CZASIE ku progowi.
    - **checklist** — sygnał: lista kryteriów ocenianych ✓/✗/— prowadząca
      do decyzji. Pola: `pozycje[3–6]{tekst, zn("v"|"x"|"-"), kotwica?}` +
      `przycisk?{tekst, akcent?, kotwica?}` (wielki przycisk-CTA z werdyktem,
      np. "BUY THE MAX" — dawaj go, gdy scena kończy się decyzją). Różnica
      od verdict-stack: checklist to samodzielna OCENA (pozycje są treścią),
      verdict-stack to checki ustępujące wielkiemu payoffowi.
    - **bus-gauge** — sygnał: przepustowość/transfer/przepływ jako RUCH
      (GB/s, tok/s, req/s). Pola: `kapsuly[1–2]{label, logo?, wartosc,
      sufiks?, pct(0–100, względna szybkość), akcent?, kotwica?}` +
      globalna `puenta`. Dwie kapsuły = pojedynek przepustowości.
    Do tego pole `logo` (enum: apple, nvidia, meta, github, docker, chip)
    dostępne w `rows` (bar-rows), `wiersze` (leaderboard), `paski` i
    `kapsuly` — wstaw logo, gdy wiersz dotyczy konkretnej marki/produktu;
    `chip` to generyczny procesor dla modeli AI bez loga w rejestrze.


## ERRATA v3.2 (chart-threshold multi-linie, 2026-08-29 — do NASTĘPNEJ redakcji promptu)

16. `chart-threshold` przeprojektowany wg feedbacku usera: zamiast jednej
    `linia` może przyjąć `linie_wykresu[1–3]{label, na_miesiac, do_x, akcent?,
    kotwica?, cross?{label, kotwica?}}` — kilka trajektorii na jednym wykresie
    (np. dwa scenariusze wydatków vs jeden próg). `label` KAŻDEJ linii renderuje
    się W POLU wykresu, przyklejony do linii pod jej kątem — dlatego label ma
    być KRÓTKI (2–4 słowa). `cross.label` (odręczny) tylko tam, gdzie przecięcie
    z progiem jest treścią sceny. Stare `linia`+`cross` działają nadal (jedna
    linia). Preferuj 2 linie, gdy lektor porównuje dwa tempa/scenariusze.


## ERRATA v3.3 (ARCHITEKTURA: scena pochodną TTS, 2026-08-29 noc)

17. PODZIAŁ LINII LEKTORA NA PLANSZE — kluczowa zmiana kontraktu (user:
    "scena ma być pochodną TTS, nie odwrotnie; czasem z jednej linii trzeba
    wyciągnąć dwa slajdy — mówiliśmy coś wartościowego, a slajd czekał").
    Znika zasada "jedna plansza na scenę". NOWA zasada:
    a) Linia lektora niosąca JEDNĄ myśl → jedna plansza (jak dotąd).
    b) Linia niosąca ≥2 ODRĘBNE myśli (zmiana tematu w połowie zdania/akapitu,
       dwie różne porcje danych, teza + dowód) → 2–3 plansze. KAŻDA KOLEJNA
       plansza tej samej sceny MUSI mieć `start_kotwica`: pierwsze słowo
       fragmentu lektora, od którego przejmuje ekran (słowo DOSŁOWNIE z tej
       linii, możliwie unikalne — jak zwykła kotwica). Pierwsza plansza sceny
       NIE ma start_kotwica.
    c) Sygnał podziału: gdyby plansza musiała czekać >⅓ linii na swoje dane
       albo pokrywa tylko połowę treści — podziel. Plansza nigdy nie powinna
       "czekać pusta", aż lektor dojdzie do jej tematu.
    d) Renderer tnie WAV po timestampie start_kotwica — głos pozostaje ciągły
       i naturalny; nie zmieniaj tekstu lektora, niczego nie dopisuj.
    e) Każda część liczy się do różnorodności i minimów jak zwykła plansza;
       części mogą mieć różne typy (np. hero-stat → bar-rows w połowie linii).

## ERRATA v3.4 (start_kotwica: słowa charakterystyczne, 2026-08-29 po nocy)

18. `start_kotwica` (i każda kotwica podziału) MUSI być słowem
    CHARAKTERYSTYCZNYM — unikatowym w swojej linii. Najlepsze: kwoty ($60,
    $5,000), liczby z jednostką (256GB), nazwy własne (Mac, DeepSeek),
    rzadkie rzeczowniki (cheapest, cloud). ZAKAZANE: the/a/at/and/one-litery.
    Powód (f30 v8): matcher tnie wav po timestampie pierwszego pasującego
    słowa — "The" trafiło w złe wystąpienie w 3 scenach, "A" i "At" złapały
    to samo "a" (scena zerowej długości). 7/12 punktów cięcia było błędnych,
    dopóki kotwice nie zostały ręcznie skurowane.

## ERRATA v3.5 (camera-world: wnętrza stacji, 2026-08-29 wieczór)

19. `camera-world` — NOWY kontrakt stacji (user: "element z pivotem kamery
    daje samą ramkę"). Stacja to już nie tytul+sub: przy zoomie kamery 1.85×
    goła karta wypełnia ekran pustką. Pola stacji (3 stacje, jak dotąd):
    - `tytul` (wymagane), `sub` (opcjonalny, krótki),
    - `akcent` (wymagane), `kotwica` (WYMAGANE — słowo lektora, przy którym
      kamera dojeżdża do tej stacji; wcześniej schemat go nie miał i kamera
      jeździła na ślepo),
    - `stat {wartosc, label}` — duża liczba stacji (np. "25.5" / "months"),
    - `punkty [1–3 {tekst, zn v/x/-}]` — konkrety ✓/✗,
    - `tag` — krótki werdykt w dashed-pill (np. "BEST VALUE").
    KAŻDA stacja MUSI mieć stat LUB punkty (bramka chudości to egzekwuje).
    Wnętrze odsłania się dopiero gdy kamera dojedzie (builder sam to robi).
    Typ pasuje, gdy lektor przechodzi przez 3 różne "miejsca" jednej mapy
    (3 wyniki, 3 profile, 3 opcje) — kamera robi krótkie pivoty między nimi.

## ERRATA v3.6 (eksplainer, nie reklama — 2026-08-29 noc, po r01)

20. DOMYŚLNY TRYB = TŁUMACZENIE DANYMI. Recenzja usera reprodukcji r01:
    "ciągle jakieś wielkie napisy zamiast na spokojnie wytłumaczyć — wygląda
    jak kampania reklamowa, nie wytłumaczenie". Kanał-wzorzec krzyczy
    2–3 razy NA CAŁY FILM; resztę niesie danymi (tabele, porównania, paski,
    wykresy, terminale). Zasady:
    a) Typy PLAKATOWE (glitch-hit, type-beats, title-card, sampler-stat,
       hero-stat) są PRZYPRAWĄ: łącznie ≤ ~1/5 plansz, nigdy dwie plakatowe
       z rzędu. Wybieraj je TYLKO tam, gdzie plan reżysera daje zwrot akcji
       (waga=przejscie z plakatową sugestią) albo filar tego wymaga.
    b) Gdy scena ma liczby/porównanie/proces — bierz typ DANYCH, nawet jeśli
       plakat "też pasuje". Sampler-stat tylko, gdy JEDNA liczba naprawdę
       jest całą myślą sceny.
    c) Usuń z heurystyk zachętę "wypatruj typów o wyraźnej metaforze" w
       obecnej formie — metafora ma służyć danym, nie je zastępować.
21. WYKONALNOŚĆ PODZIAŁU: plansza żyje ≥ ~4 s. Linia ~N sekund mieści
    maksymalnie floor(N/4) plansz. Nie dziel krótkich linii; lepiej jedna
    treściwa plansza niż dwa flashe (user: "przeskok po sekundzie, wtf").

## ERRATA v3.7 (prop-card v2, 2026-08-30)

22. `prop-card` przemodelowany (user: słupki-atrapa bez wartości = porażka).
    Pola: `tytul_karty?`, `slupki[2–7]{label, wartosc(number), jednostka?,
    kotwica?}` (obiekty OBOWIĄZKOWO — gołe liczby to anonimowe słupki),
    `wyroznij?` (indeks zwycięzcy), `podpis?` + `podpis_kotwica?` (głos
    autora pod wykresem). Builder: hatch-słupki na ciemnym tle, wartość
    handwritten NAD słupkiem (count-up), label POD, ring na wyróżnionym,
    wysokość ∝ √wartości (rozpiętości 6↔1M nie gubią małych). R13: słupki
    muszą nieść porównanie z treści — nie dekorację.

## ERRATA v3.8 (markers WYCOFANY, 2026-08-30)

23. Typ `markers` (podkreślenia/obwódki/highlighty fraz) WYCOFANY decyzją
    usera ("z tych zaznaczeń bym w ogóle zrezygnował") — po trzech rundach
    napraw geometrii nadal psuł odbiór. Zniknął ze schematu. Treści
    twierdzeniowe bez danych → type-beats (krótko) albo checklist/flow,
    zgodnie z R9/R13; NIE zastępuj markers mechanicznie jednym typem.

## ERRATA v3.9 (fala F2 — 5 nowych typów, 2026-08-30)

24. Nowe typy (side-by-side z wzorcem pokazał ich brak jako źródło monotonii):
    - `bench-table`: kolumny[2–3]{label,akcent?,logo?}, wiersze_bench[2–6]
      {test, wartosci[2–3], wygrywa?(indeks), kotwica?} — tabela wyników,
      zwycięzca wiersza podświetlony i ringowany.
    - `param-grid`: total, aktywne, total_label/+kotwica, aktywne_label/+kotwica
      — siatka kropek: całość gaśnie w tle, aktywna frakcja zapala się falą.
      Do relacji "N z M aktywne/użyte" (R13!).
    - `funnel`: gora{label,kotwica?}, dol{wartosc,label,kotwica?} — lejek
      redukcji (wiele → jedna wielkość w gardzieli).
    - `layer-wall`: total(4–64), label?, wyroznione?{od,do,label,akcent?,kotwica?}
      — ściana cienkich warstw, wyróżniony zakres w innym kolorze.
    - `dial-gauge`: procent, wartosc?, label?, kotwica? — tarcza łuku dla
      JEDNEGO procentu/udziału.
    Dobór wg R9b w DYDAKTYCE; te formy mają pierwszeństwo przed flow/compare,
    gdy relacja treści pasuje (koniec "flow do wszystkiego").

## ERRATA v4.0 (przykłady zamiast reguł — plan naprawy, 2026-08-30)

25. Wymiana złotego przykładu: zamiast `flow` (typ-klej, który prompt
    promował przykładem, a wyniki miały flow×12/36) — pełny przykład
    `param-grid` ALBO `bench-table` z danymi z realnej sceny. Drugi przykład
    zostaje `bar-rows`. Opisy „Kiedy wybrać" dla F2 rozbuduj do pełnych zdań
    z domeną (jak capacity-bar): param-grid „N z M aktywne — 6B z 180B,
    10 z 512 ekspertów"; funnel „setki tysięcy tokenów → jedna liczba
    w gardzieli"; dial-gauge „jeden udział procentowy — 3.3% sieci";
    bench-table „te same testy, 2–3 modele, zwycięzca wiersza"; layer-wall
    „48 warstw, 12 wyróżnionych". BEZ dodatkowych zakazów i minimów w prozie
    — pokazuj przykładem (doktryna anty-bloat usera).

## ERRATA v4.1 (kompozycje — pole wspólne `wspierajace`, 2026-08-30)

26. NOWE pole wspólne KAŻDEGO typu: `wspierajace[1–2]{wariant, …}` —
    element wspierający kompozycji (R2' w DYDAKTYCE; wzorzec łączy 2–3
    elementy w hierarchii). Warianty:
    - `wskaznik` {procent, wartosc?, label, kotwica?} — mini-tarcza udziału
      obok elementu głównego (wzorzec: zegar "3.1%" przy siatce),
    - `side_stat` {wartosc, label, kotwica?} — duża liczba boczna,
    - `mechanizm` {elementy[2–4]{tekst, kotwica?}} — mini-flow "jak to
      działa" pod głównym (wzorzec: token→router→10→expert pod siatką),
    - `tagi` {elementy[1–4]{tekst, kotwica?}} — pigułki cech przy karcie.
    Pokaż w złotym przykładzie scenę z `wspierajace` (np. param-grid
    + wskaznik). Wspierający uzupełnia głównego — nie dubluje jego danych.

## ERRATA v4.2 (4 nowe formy + kompozycje przykładami — audyt codex, 2026-08-30)

1. Nowe typy plansz (kontrakty pól `dane`):
   - `slot-strip` — budżet slotów/bloków: {total, uzyte?, jednostka?, label?,
     uzyte_label?, uzyte_kotwica?, zakresy[≤4]{od, do, label, akcent?, kotwica?}}.
     Pasek wielu slotów; `uzyte` zapala się od początku paska; `zakresy` to
     klamry z podpisami. Wartość na elemencie: "uzyte/total jednostka".
   - `branch-diagram` — topologia, nie sekwencja: {os_label, galezie[2–6]{label,
     kotwica?, akcent?}, bramka_we?, bramka_wy?}. Jedna pozioma oś przepływu,
     gałęzie odchodzą łukami, bramki oznaczone na wejściu/wyjściu gałęzi.
   - `expert-map` — pula jednostek: {total, duze?, aktywne?, wspolny?,
     total_label?, total_kotwica?, aktywne_label?, aktywne_kotwica?}.
     Siatka `total` małych komórek; gdy `duze` podane — obok kontrast kilku
     dużych bloków; `aktywne` (+`wspolny`) zapala trasę.
   - `cta-endcard` — WYŁĄCZNIE ostatnia scena filmu: {tytul, sub?,
     przycisk{tekst, kotwica?}?, tagi[≤5]?}.
2. ZASTĄP dotychczasowe ogólne akapity o różnorodności/doborze poniższym
   blokiem przykładów DOSŁOWNIE (przykłady niosą tę samą treść konkretem —
   usuń powtórzone ogólniki, nie dokładaj zakazów):

```md
## Cztery przykłady pełnej kompozycji

LEKTOR: „QSA przeszukuje najwyżej 512 mikrobloków, czyli 2048 tokenów,
w pozostałych 12 warstwach.”
KOMPOZYCJA: dominanta `slot-strip` z 512 blokami; wspierający `side_stat`
„12 QSA layers”; puenta „2,048 active tokens”.
Nie używaj `capacity-bar` 512/512.

LEKTOR: „Informacja przechodzi przez 4 branch-gated residuals, z bramkami
odczytu elementów i skalarnymi bramkami zapisu.”
KOMPOZYCJA: `branch-diagram`: jedna oś residual stream, cztery gałęzie,
read gate i write gate oznaczone na gałęziach.
Nie zamieniaj topologii na liniowy `flow`.

LEKTOR: „AndroidWorld 84,5%, Toolathlon 73,5%; model obsługuje system,
UI actions i API toolchains.”
KOMPOZYCJA: dwie tarcze procentowe jako dominanta oraz mały mechanizm
„OS → UI actions → API toolchains” pod nimi.
Karty tekstowe nie pokazują wielkości procentów.

LEKTOR: „Kontekst można rozciągnąć do miliona tokenów, ale stały YaRN
pogarsza krótkie prompty i wymaga ręcznego strojenia RoPE.”
KOMPOZYCJA: wraca motyw `context-window`; pasek native→1M pozostaje dominantą,
mała tarcza pokazuje degradację krótkich promptów, a tag niesie ręczne strojenie.
To trade-off na jednym systemie, nie stan „przed” i „po”.
```

3. Pole wspólne `motyw_id` (string ≤32): przepisuj z planu reżysera do koperty
   sceny. Ta sama metafora w ≥2 scenach = ta sama forma i geometria; zmieniają
   się dane i akcent, nie język wizualny.

## ERRATA v5.0 (TABLICE — fala tablic, 2026-08-30)

1. Nowy typ `tablica`. Plan reżysera grupuje linie slugiem `tablica` — dla
   KAŻDEJ linii takiej grupy wyemituj planszę {scena: <ta linia>, typ:
   "tablica", kicker: <ten sam w całej grupie>, akcent, dane}. `dane` (string
   JSON jak zawsze) zawiera: {"tablica_id": <slug z planu>, "podmiot"?:
   <z pierwszej linii>, "moduly": [1–3 moduły TEJ linii]}.
2. Moduł: {"typ": ..., "kotwica": <słowo z TEJ linii>, ...pola typu}.
   Typy modułów: «KARTY_TYPOW» (wstrzykiwane — zostaw placeholder DOSŁOWNIE).
   Dodatkowo prymitywy tablicy: zdanie-token {tekst, token, faktura?},
   chip-row {chipy[{tekst, ikona?}]}, dashed-tag {tekst, ikona?} (puenta
   tablicy — zawsze OSTATNI moduł ostatniej linii), stat-inline {do, label,
   strzalka?{do, suffix}}, klamra {od, do, z, liczba, label, sub?},
   lookup-table {tytul?, badge?, wiersze[{k, v}], wyroznij?},
   scribble {wariant: kolo|strike, cel: "mJ"}.
3. Na planszy tablicy ZAKAZANE: puenta (panel), wspierajace, start_kotwica —
   ich rolę pełnią moduły. Sekwencja ról na tablicy: podmiot → mechanizm →
   liczba → puenta (R15). Nic nie znika i nic nie przygasa (R16).
4. Złote przykłady pełnych tablic: «ZLOTE_TABLICE» (wstrzykiwane — zostaw
   placeholder DOSŁOWNIE, wiersz przed «PLAN» jeśli jest, inaczej na końcu
   sekcji przykładów).
