# HANDOFF — identyfikacja_yt (dla agenta bez kontekstu)

> Stan na 2026-08-29 PÓŹNA NOC (3. doba). Ten workspace to SANDBOX
> mini-fabryki wideo „styl jako dane" — prototyp pod port do
> `misc/wytwornia` (NIETYKALNEJ do czasu decyzji usera). Pełne „dlaczego":
> [ROZKMINA_fabryka_stylow_2026-08-28.md](ROZKMINA_fabryka_stylow_2026-08-28.md)
> (sekcja STATUS na górze) + [fabryka/NOTATNIK_STYL_REPOCHAD.md](fabryka/NOTATNIK_STYL_REPOCHAD.md).

## ⚡ W jednym akapicie

Zidentyfikowaliśmy, że kanał YT „RepoChad" robi filmy agentowym pipeline'em
HTML→wideo (HyperFrames-klasa), odtworzyliśmy jego styl 1:1, a potem zbudowaliśmy
własną MINI-FABRYKĘ: `film.json` (dane scen + kotwice słów lektora) + skin JSON →
`fabryka/generuj.mjs` → TTS (Kokoro, timestampy słów) → klatki z 22 builderów →
napisy karaoke → render MP4. **Zero LLM przy klatkach.** LLM (scenograf v2,
gpt-5.6-sol przez most wytwórni) tylko zamienia scenariusz w `plansze.json`
(schemat `fabryka/plansze-v2.schema.json`). Działa E2E z realnego transkryptu
(f22). Jakości pilnują DWIE BRAMKI w kodzie (rozmiary + pokrycie kadru).

## Mapa plików (60 s)

```
fabryka/
  generuj.mjs          ← composer: film.json+skin → cały projekt HF (wpięte bramki)
  komponenty.mjs       ← core: runtime OPS + buildery hero/bar/chart/verdict/card…
  komponenty-extra.mjs ← +16 builderów (flow, compare, leaderboard, tier-header…)
  lektor-tts.mjs       ← wygładzacz TTS (jednostki, $→dollars, RAM→ram) + warianty kotwic
  test-rozmiary.mjs    ← BRAMKA 1 (build-time): podłoga 1.15cqw/20px + anatomia; STOP
  audyt_klatek.py      ← BRAMKA 2 (wizualna): zajętość siatki → flagi pusta_scena/martwy_dol
  captions-fork.mjs    ← FORK grupowania napisów (scalanie do 26–52 znaków; generuj używa FORKA)
  przeglad.py          ← BRAMKA 3 (przed wysyłką): kadry 2/scenę → przeglad.jpg + BRAMKA CISZY
                          (silencedetect na MP4); AGENT MUSI Read PRZED SendUserFile
  testy-fixtury.json   ← 22 sceny-fixtury (kopia film.json sondy f00)
  skiny/*.json         ← 9 skinów (repochad-dark, repochad-hand, blackboard, paper,
                          poster, candy, terminal-crt, neon-glitch, swiss)
  caption-skiny/*.html ← 4 tożsamości napisów (repochad-vibrant = domyślna dark)
  prompty/SCENOGRAF_V2.md ← prompt produkcyjny (NAPISAŁ codex1; my tylko brief+errata)
  plansze-v2.schema.json  ← schemat wyjścia scenografa: 21 z 22 typów (poza nim tylko
                             meta caption-specimens); ALIASY schema→builder tłumaczy
                             scenograf_run (etykieta→badge, karta→card, komendy→linie,
                             type-beats payoff.html→tekst); bez oneOf/maxLength!
  e2/                  ← pisz_prompt.py (codex1→prompt), recenzuj_prompt.py (recenzja
                          przez codex → recenzja_prompt.md), scenograf_run.py (test+film.json),
                          scenariusz_repochad*.txt, analiza_*.md (4 raporty agentów — w tym
                          analiza_OXZ14OErwOw.md: NOWE elementy do puli, patrz OTWARTE),
                          media/ (wideo+klatki 4 filmów kanału, mozaiki, transkrypt whisper)
  NOTATNIK_STYL_REPOCHAD.md ← synteza stylu + WDROŻONE rundy 1–4 + DO ZROBIENIA
videos/
  local-ai-break-even/ ← pierwowzór (tryb rzemieślniczy LLM, ~650k tok) — NIE RUSZAĆ
  f01-crown-repochad/  ← test koronny (te same dane, 0 tokenów)
  f02…f20/             ← katalog 20 demo (8 skinów + grupy elementów; galerie niżej)
  f22-repochad-transcript/ ← E2E z realnego transkryptu (scenograf LLM) — GŁÓWNY poligon
  f23-hand-era/        ← skin repochad-hand + wnętrza kart + SFX
  f00-audyt/           ← sonda regresyjna 22 builderów (dla bramek)
  f27-stress/          ← SONDA STRESOWA: 22 buildery na EKSTREMALNYCH danych (długie
                          teksty, max liczności, próg=maxY); `generuj` + `check` musi być
                          zielone po każdej zmianie builderów (złapała title-card overflow
                          i kolizję thlbl/crosslbl, których fixtury f00 nie widziały)
BRIEF_scenograf_v2_dla_codex1.md ← brief + ERRATA v2.1 (pkt 1–5)
katalog.html           ← lokalna galeria 20 filmów (relatywne ścieżki, seek działa)
przeglad-metod.html    ← PRZEGLĄD WSZYSTKICH METOD: 22 buildery (klip z f24 + opis +
                          pola + tag sygnałowy/roboczy), 9 skinów ze swatchami, 4 style
                          napisów; klipy: videos/f24-pokaz-22/renders/klipy/ (cięte
                          z renderu wg STORYBOARD, postery #t=0.8 za ogonem przejścia)
artifact_*.html        ← źródła artifactów (opublikowane, patrz niżej)
```

Artifacty: rozkmina https://claude.ai/code/artifact/43f00b04-264a-48de-89de-1a7b557756eb
· galeria https://claude.ai/code/artifact/91cc13e4-a349-48ab-9eea-56d3e30e2ef3

## Jak uruchomić (przepis)

```
npx hyperframes init videos/<id> --non-interactive --example=blank --skill=faceless-explainer
<napisz videos/<id>/film.json>            # wzory: f23, f22, f00 (fixtury)
node fabryka/generuj.mjs videos/<id> --tts [--audyt]
( cd videos/<id> && npx hyperframes check && npx hyperframes render --quality high --output renders/<id>.mp4 )
```

Scenograf (LLM→plansze→film.json): `python3 fabryka/e2/scenograf_run.py --scenariusz
<plik> --projekt videos/<id> --film-id <id> --tytul "…" --binarka codex1|codex2`.
Prompt przepisuje WYŁĄCZNIE codex1: `python3 fabryka/e2/pisz_prompt.py` (czyta brief
z erratą). Most: `wytwornia/wspolne/llm_most.py` (import, NIE edytować).

## Doktryny usera (obowiązują)

1. Prompty produkcyjne pisze **codex1** — my briefy/erraty.
2. Flagi zamiast stopów treści; stop tylko na bugi biblioteki (bramka 1) i AWARIE.
3. **KISS dotyczy architektury, NIE designu** — kadr ma być bogaty jak wzorzec
   (user ubił moją złą racjonalizację — nie powtarzać).
4. Flaga z audytu = naprawa albo jawna decyzja; nigdy „prawie przechodzi".
5. Porównania z ORYGINAŁEM (klatki wzorca ↔ nasz render, side-by-side) to główny
   silnik jakości; mozaiki klatek: `fabryka/e2/media/klatki_*/`.
6. **Delegacja decyzji** (user 2026-08-29): "ty decyduj, które rozwiązanie
   jest najlepsze; słuchaj mnie, ale nie jestem nieomylny — jeśli widzisz,
   że coś działa lepiej niż mówię, rób adjustment i UZASADNIAJ dlaczego".
   Czyli: decyzje techniczne podejmować samodzielnie na danych (pomiary!),
   odstępstwa od poleceń usera zawsze z jawnym uzasadnieniem.
7. Różnorodność typów — podział (po "zrób porządek" 2026-08-29): HIGIENA
   rozkładu (zero powtórek w sąsiedztwie, ≥4 typy, hero-stat ≤2) i MINIMA
   WNĘTRZ (errata 11: leaderboard/bar-rows ≥3, karty z punktami+stopką,
   compare ≥2 pkt/stronę, chart z puentą…) obowiązują ZAWSZE — bramka
   jakości rozkładu w scenograf_run robi retry (max 2) z listą nieużytych
   typów i minimami, potem flagi. `--wymus-roznorodnosc` (tryb testowy,
   pokaz wariantów) JEDYNIE podnosi cel unikalnych typów do min(12, 60% N).
   Sam opis typów w prompcie NIE wystarcza (grawitacja bezpiecznych typów:
   2× z rzędu pierwsze podejście = 5 typów, hero-stat×7) → errata 10 każe
   promptowi wymuszać PROCEDURĘ doboru (najpierw typy sygnałowe, potem
   robocze); miarą jakości promptu jest pierwsze podejście bez retry.

## PUŁAPKI (opłacone)

- **cwd resetuje się między turami agenta** → zawsze `cd /Users/gileneo/www_new/misc/identyfikacja_yt`
  na początku komendy (raz pliki poleciały do złych katalogów).
- ID elementów NIE mogą zaczynać się cyfrą (CSS selector) — buildFrame prefiksuje `f`.
- fill/track pasków = `display:block` (span inline gubi width).
- Kokoro: normalizuje liczby („$2,499" jako token), czyta „$500" jako „dollar 500"
  i literuje RAM → wygładzacz w `lektor-tts.mjs` (waluta→„500 dollars", RAM→ram);
  kotwiczyć na słowach nie-liczbowych.
- **Interpunkcja NIE może wejść do rozwijanej liczby**: stary regex walutowy
  łapał kropkę zdania („$2,499." → „2,499. dollars") → Kokoro czytało kwotę,
  PAUZĘ zdaniową, „Dollars", pauzę — user tego słuchać nie mógł (2026-08-29).
  Fix: liczba kończy się cyfrą, interpunkcja przeskakuje ZA słowo
  („2,499 dollars. It"). To też źródło wtrąconego „Dollars" w napisach.
  Każda nowa reguła rozwijająca MUSI mieć test na wariant z „X." i „X,".
- `hyperframes init` odmawia niepustego katalogu → init PRZED zapisem film.json.
- Schemat do codexa: tylko enum/minItems/maxItems/additionalProperties:false
  (bez oneOf/maxLength — deterministyczny invalid_json_schema).
- Konta codex mają limity 5h/tyg (`LimitLLM`) — codex1 → fallback codex2; oba padły
  2026-08-29 nad ranem, resetują się same.
- Autoplay YouTube w panelu przeglądarki GRA DŹWIĘK — user słuchał filmu; nie
  otwierać kart YT (transkrypty: yt-dlp audio + whisper-cli lokalnie).
- Kamera per scena zwiększa bitrate ~2× (wszystko się rusza) — normalne.
- **Silnik TTS gubi linie PO CICHU**: kokoro = osobny proces `npx hyperframes tts`
  per linia (równolegle); potrafi zapisać POPRAWNY wav i wyjść niezerowo →
  silnik audio loguje "anomaly (non-fatal)", wyrzuca linię z voices i kończy
  z kodem 0 → scena bez głosu i napisów (f22 v11: 14 s ciszy; w logu było
  "silent" — miękki tekst nie wystarcza). Od v12 pilnują tego BRAMKA AUDIO
  w generuj.mjs (licznik głosów vs sceny, retry ×3, twardy STOP) i BRAMKA
  CISZY w przeglad.py (silencedetect ≥2.5 s na finalnym MP4 = exit 1).
- pip: instalacja kokoro podbiła protobuf→7.36 (konflikt z google-api-core <5) —
  NIEROZWIĄZANE, zgłoszone userowi.

## OTWARTE / następne kroki

### ⚡ PO COMPACT ZACZNIJ TU (stan 2026-08-29 wieczór — BATCH REPRODUKCJI W TOKU)

**WERDYKT USERA o f30 v8**: "duzo lepsze, improvement, good job — ale do
poziomu oryginału trochę brakuje". Trzy zlecenia: (1) wykres dalej breakuje →
NAPRAWIONE W SILNIKU (patrz niżej), dowód przed/po wysłany; (2) reprodukcja
CAŁEGO kanału naszym flow ("zobaczymy czy będzie efekt") → BATCH W TOKU;
(3) camera-world "daje samą ramkę" → NAPRAWIONE (wnętrza stacji).

**WERDYKT USERA o r01 v1: "STRASZNY MESS"** (+ "przeskok po sekundzie 1:25",
"wielkie napisy zamiast spokojnie wytłumaczyć — kampania reklamowa, nie
wytłumaczenie"). DIAGNOZA (potwierdzona klatkami): (1) konwerter transkryptu
ciął linie W PÓŁ ZDANIA na twardych limitach — dane sceny lądowały w cudzej
linii → czarne plansze, chaos typów; (2) minimum segmentu 1.2 s techniczne,
nie percepcyjne → flash-plansze; (3) inflacja plakatów (glitch/type-beats/
hero-stat wszędzie) — kanał krzyczy 2–3×/film, resztę niesie danymi;
(4) ASR-owe przekręty nazw ("QEN 3.8") na planszach. NAPRAWY (wszystkie w
kodzie/promptach): konwerter v2 (granice TYLKO na zdaniach wykrywanych w
całym tekście, czasy interpolowane po znakach; 68 czystych linii); MIN_SEG
3.5 s + awaryjny obniżony próg z logiem; bramka wykonalności (plansza ≥4 s
lektora) + BUDŻET PLAKATÓW (≤ ~22%/porcja) w scenograf_run; budżet krzyku
3–4/film w briefie reżysera; REDAKTOR (nowy etap 0: czyszczenie ASR bez
parafrazy, bezpiecznik difflib ≥0.75 podobieństwa) — BRIEF_redaktor,
pisz_prompt_redaktor.py, redaktor_run.py; wszystkie 3 prompty przepisane
przez codex1. PORCJOWANIE scenografa (PORCJA=16, plan reżysera na całość,
typy poprzednich porcji w prompcie, bramki per porcja) — user pytał
"dlaczego ograniczasz?" → wyjaśnione: limit na wywołanie LLM, nie na film.
rezyser.schema sceny maxItems 64→120.

**BATCH REPRODUKCJI (daemon nohup PID w logu, monitor bf803f945):**
- STAN: batch ZATRZYMANY po werdykcie "mess"; kręci się TYLKO rerun r01 v2
  pełnym nowym łańcuchem (redaktor→reżyser→scenograf→build). Po "OK [r01]"
  w logu: OBEJRZYJ klatki sam (przeglad.jpg + 3–4 kadry z mp4), wyślij v2
  z pokorną notą; batch 13 pozostałych wznowić DOPIERO po werdykcie usera.
- Kanał repochad ma ŁĄCZNIE 14 filmów — analiza agentowa 14/14 już była
  (analiza_*.md), więc "ostatnie 20" = wszystkie.
- Transkrypty: Whisper na mac mini (worker :8782, slug `repochad`, job 624
  done 14/14). Segmenty: `GET /api/channels/repochad/artifact/<ID>/segments_json`.
- Flow per film: `fabryka/e2/batch_repro.sh` (daemon; log w scratchpad
  `batch_repro.log`): segmenty → `transkrypt_na_scenariusz.py` (linie 7–14 s,
  koniec zdania) → `scenograf_run.py` (reżyser+scenograf v2.8) → generuj --tts
  → check → render → przeglad (bramka ciszy) → kompakt crf26.
  Projekty: `videos/r01-OXZ14OErwOw` … `r14-kLar1zY2hTY` (kolejność:
  najnowsze pierwsze). Padnięty krok = "!!!" w logu i przejście do następnego.
- PO KAŻDYM "OK [rNN]": wyślij kompakt userowi (pierwsze 1–2 od razu, resztę
  można partiami). NIE edytować fabryka/*.mjs w trakcie batcha (PUŁAPKA:
  buildy w tle czytają bibliotekę).

**NAPRAWY SILNIKA TEGO WIECZORU (po v8, przed batchem):**
- (c) chart-threshold KURACJA GEOMETRII v3 (komponenty.mjs): LLM daje
  maxY==prog i maxX==do_x "na styk" → przecięcie w rogu. Silnik wymusza:
  próg ~45% wysokości (maxY ≥ prog×1.55), przecięcie ≤~74% szerokości
  (maxX ≥ cross×1.35), linia biegnie ZA próg (do_x ≥ cross×1.22), vline
  kończy się nad panelem puenty (748px). Naprawiony utajony błąd: clamp
  endY→maxY wyginał nachylenie względem punktu przecięcia.
- (d) camera-world v2 (komponenty-extra.mjs + schemat + prompt v2.8):
  stacje mają wnętrza `stat{wartosc,label}` / `punkty[≤3{tekst,zn}]` / `tag`
  + WYMAGANE `kotwica` (schemat wcześniej nie miał — kamera jeździła na
  ślepo!). Bramka chudości: stacja bez stat/punkty = flaga. Wstecznie
  kompatybilny.
- (e) dosuw: flaga `dosuw` w audio_meta (rebuild NIE liczy od nowa —
  wcześniej ffmpeg input==output crash), exact-first matcher (jak przy
  podziałach) — poprawił też pokrycie (s12 terminal dostał +7.8 s).
  Guard input==output z czytelnym die.
- f30 v9test (renders/f30_v9test.mp4) = f30 z naprawami — wykresy
  zweryfikowane wizualnie, przed/po wysłane userowi.

**DWA BUGI ZNALEZIONE I NAPRAWIONE PRZY v8 (ważne lekcje):**
- (a) `plansze.maxItems: 24` vs plan reżysera 20 linii + 8 podziałów = 28
  → model UCIĄŁ KOŃCÓWKĘ (s19/s20 = cały werdykt zniknął). Fix: maxItems 40
  + twarda bramka arytmetyczna w scenograf_run (linie+podziały>cap = STOP)
  + flaga `--plan <plik>` (reużycie dobrego planu bez losowania nowego).
- (b) matcher punktów cięcia TTS w generuj.mjs: symetryczny prefix +
  pierwsze wystąpienie w linii → 7/12 cięć błędnych ("25"↔"256GB",
  "a"↔"At"/"A" — dwa cięcia w tym samym słowie = scena zerowa). Fix:
  dopasowanie DOKŁADNE przed prefiksowym + okno monotoniczne (szukaj za
  poprzednim cięciem) + kotwice skurowane na słowa unikatowe ($60, $5,000,
  cheapest, cloud, Mac). Errata 18 w BRIEF_scenograf + zasada 5 w
  BRIEF_rezyser: słowa podziału CHARAKTERYSTYCZNE, nigdy the/a/at.

**ARCHITEKTURA REŻYSERA (wdrożona, PRZETESTOWANA end-to-end na f30 v8):**
- `BRIEF_rezyser_dla_codex1.md` → prompt pisze `fabryka/e2/pisz_prompt_rezyser.py`.
- `fabryka/rezyser.schema.json`: plan{logline, luk[hook/rozwiniecie/dowod/werdykt],
  sceny[{scena, waga(filar/normalna/przejscie), fokus, typ_obowiazkowy?,
  typ_sugestia?, podziel_od?[], koncentracja?}]}.
- `scenograf_run.py`: ETAP 1 reżyser (opt-out --bez-rezysera) → plan do
  `e2/plan_<id>.json` + wstrzyknięty do promptu scenografa jako NADRZĘDNY;
  walidator `zgodnosc_planu()` w pętli retry (filar bez nakazanego typu /
  niewykonany podział = korekta).

**ROZWIĄZANIA TEJ NOCY (działają, w kodzie):**
1. DOSUW GRANIC (generuj.mjs) — deterministyczne rozwiązanie PUSTYCH PLANSZ:
   nowa plansza wchodzi ~0.9s przed swoją pierwszą kotwicą; taśma lektora
   [0..D] przechodzi do POPRZEDNIEJ klatki (concat wav, words wędrują);
   na f30 przesunęło 7/21 scen (+1.8…+8.7s). Idempotentne. NIE RUSZAĆ.
2. PODZIAŁ TTS (czesc_z + start_kotwica, errata 17): kilka plansz na linię,
   wav cięty po timestampie słowa. Działa (f30: s17→s17b na "Private").
3. KAMERA (STOP-y usera!): (a) antyPustka WYCOFANA (dane nie mogą wchodzić
   przed słowem lektora); (b) dryf/zoom całej planszy USUNIĘTY (pikselizacja)
   — kameraOps = TYLKO krótkie pivoty builderów + 1 zjazd do finału 0.55s;
   chart bez "oddechu". NIE przywracać driftu ani globalnych clampów wejść.
4. chart-threshold v2: multi-linie (`linie_wykresu`), etykiety W POLU pod
   kątem linii, tag wyniku NA pionowej lince, pill progu od prawej, axislbl
   nad puentą gdy puenta. Próbka wysłana (f31).
5. Fork napisów 24–40 zn. (pill 1-liniowy), clamp domknięć ≥62% dur,
   scribble POD baseline, TTS bez pauz w kwotach (interpunkcja za słowem).

**PO WYSŁANIU f30-z-reżyserem, kolejność:**
1. Werdykt usera nad planem reżysera → tuning briefu reżysera.
2. Fale z `fabryka/e2/SYNTEZA_ELEMENTOW.md` (14/14 filmów przeanalizowanych):
   F1 dokończyć (scribble-prymityw, capacity separatory, hero stat-row,
   puenta caret), F2 = bench-table(×4!), equation-row, bubble, code-card,
   dial-gauge, param-grid, bar-rows 2 serie, cta-endcard; F3/F4 wg SYNTEZY.
3. REPRODUKCJA 1:1 (maxItems 24→60, scenograf partiami, pełny transkrypt
   psNfWOOtBGM) → porównanie usera z oryginałem.
4. Eksperyment ONE-CANVAS (kamera lata po wszystkich slajdach jak wzorzec).

**WYSŁANE USEROWI (ma u siebie):** f30 v6 (ocenił źle), f25/f26 finalne,
f24 pokaz 22, f29 P1 demo, f31 chart-próbka, side_by_side.jpg (wzorzec|my),
przeglad-metod.html (25 builderów), SYNTEZA_ELEMENTOW.md, analiza ×14.



-6. **[W TOKU] Recenzja usera f30 (2026-08-29 noc) — iteracja vs oryginał:**
   Zarzuty→przyczyny→fixy: (1) "10 s bez contentu 0:58–1:08, niewybaczalne"
   = kotwice danych padają na końcu zdania lektora. PIERWSZA PRÓBA: globalny
   clamp wejść (antyPustka: 1. element ≤15% dur) — **USER: STOP, wycofane
   w całości** (pokazywało dane ZANIM lektor o nich mówi = łamało reveal na
   słowie, fundament stylu). USER wskazał WŁAŚCIWĄ architekturę: "scena ma być
   pochodną TTS — czasem z jednej linii trzeba wyciągnąć dwa slajdy".
   [WDROŻONE, f30 v6]: schemat +`start_kotwica` (pole wspólne); scenograf
   może dać KILKA plansz na linię (errata 17 — kolejne z start_kotwica =
   słowo przejęcia ekranu); scenograf_run mapuje na sub-sceny (s17→s17b,
   pole czesc_z); generuj.mjs TNIE GOTOWY WAV po timestampie słowa
   (głos ciągły, words dzielone, sceny dalej zwykłe — buildery nietknięte).
   Dowód: f30 v6 — linia s17 → type-beats + markers od "Private", cisza
   czysta, check passed. NIE wracać do globalnych clampów czasu wejść. (2) "przekreślenia 1:26
   to chyba bug" = scribble rysował się przez dolną ⅓ glifów → przesunięty
   POD baseline [ZROBIONE]; (3) "wykresy break-even dalej słabe, bez wielu
   linii, top na górze" = user oglądał f30 sprzed chart-v2 → prompt v2.6
   (errata 16) + scenograf rerun f30 W TOKU, potem rebuild+render+side-by-side
   z klatkami wzorca psNf (doktryna 5); (4) "proste info w ramkach — model
   nie nestuje tooli" = płytkie wnętrza kart → adresuje F2 (bench-table,
   mini-bary w kartach) — NASTĘPNE; (5) KAMERA — doktryna po v6 (user: "całość leniwie się porusza
   z tłem → pikselizacja; ruszać ma się TOOL, nie całość; krótkie pivoty
   skupiające uwagę OK"): USUNIĘTY fallbackowy drift/zoom całej planszy
   i mikro-oddech chartu; kamera-całość = WYŁĄCZNIE krótkie pivoty (beaty
   builderów + jeden zjazd do finału 0.55s); między beatami kadr STOI.
   [WDROŻONE f30 v7]. (6) POMYSŁ USERA na przyszłość:
   "kamera pivotująca po WSZYSTKICH slajdach" = tryb ONE-CANVAS jak
   w oryginale (jeden morfujący world, sceny jako regiony, kamera lata)
   — eksperymentalna architektura, osobny E-projekt po falach.

-5. **[ANALIZY ZAKOŃCZONE 14/14, IMPLEMENTACJA W TOKU] Wielka pętla kuracji:**
   (a) FLOTA: wszystkie 14 filmów kanału przeanalizowane (14 × analiza_*.md
   w e2/). SYNTEZA → **e2/SYNTEZA_ELEMENTOW.md** (wysłana userowi): klastry
   wg częstości między filmami; ODKRYCIE: kanał ma DWA formaty — (A) explainer
   /plansze i (B) AI NEWS = tweet-reader (posty X ~40–50% czasu, cozy-room,
   maskotka, memy; pula 25 prawie nieużywana). Najsilniejsze klastry A:
   bench-table ×4, scribble-annotation ×4, bubble ×3, cta-endcard ×3,
   equation-row ×3; B: tweet-card ×5 (krytyczny), cozy-room ×5, cta ×5.
   DECYZJE (delegacja): implementacja falami F1–F4 wg planu w SYNTEZIE;
   z formatu B tylko podzbiór czysto-HTML (tweet-card, press-excerpt,
   quote-band, output-label, demo-bezel) — ambient/maskotka/footage/memy
   POZA zakresem (zewnętrzne asety/prawa).
   (b) REPRODUKCJA 1:1 z identycznym lektorem: po fali F2 (maxItems 24→~60,
   scenograf partiami po ~18 scen, pełny transkrypt psNfWOOtBGM).
   (c) [ZROBIONE] chart-threshold v2 (feedback usera "break-even nie wyszedł"):
   1–3 linie (`linie_wykresu`), etykiety W POLU wykresu pod kątem linii,
   crossy per linia, pill progu od prawej, WŁASNY mikro-oddech kamery 1.035
   (fallback 1.055 wypychał pill za kadr); 3 iteracje na snapshotach f31;
   schemat+walidator+alias+errata 16 w briefie (prompt przy syntezie).
-4. **[ZROBIONE 2026-08-29] Kamera podążająca + finalny komplet:** kamNa()
   (beat prowadzący punkt sceny ku środkowi; tilt; clamp X pełny, Y asym.
   max 8px w górę — chronił nagłówki), beaty w 8 builderach, finał schodzi
   DO puent (stary punch uciekał w górę). Fork napisów 24–40 zn. (pill
   ZAWSZE 1-liniowy; 44 zn. zawijało się w puentę — f26), clamp domknięć
   (puenta/werdykt/przycisk ≥62% dur — kotwica częstego słowa łapała
   1. wystąpienie i ściągała puentę na środek sceny). TTS: interpunkcja
   poza liczbą (kwoty bez pauz) + reverse-norm Kokoro daje napisom "$4,800".
   f25/f26/f30 przebudowane na ujednoliconej wersji, check ×3 passed,
   wysłane. PUŁAPKA nowa: równoległe edycje biblioteki podczas builda w tle
   = build na wersji pośredniej (f26 fałszywy fail) — sekwencjonować.

-3. **[ZROBIONE 2026-08-29] Scenograf zna pełną pulę: schemat 21→24** (errata 15:
   capacity-bar/checklist/bus-gauge z sygnałami i rozstrzygnięciem capacity-bar
   vs chart-threshold; pole `logo` enum w rows/wiersze/paski/kapsuly), prompt
   v3.2 (11.7k zn.), walidator+PODPOWIEDZI zaktualizowane. POMIAR f30 = REKORD:
   **16 unikalnych typów na 20 scen, 0 flag**, wszystkie 3 nowe typy użyte
   z własnej woli LLM (capacity-bar×2 — w tym overflow na scenie Qwen 111.6
   vs 96GB, dokładnie wg projektu; retry poprawiał tylko chude wnętrza).
   Film f30 wysłany (5m08s). Nowa klasa naprawiona w builderach: LLM kotwiczy
   główny element na OSTATNIM słowie zdania ("second" @92% sceny → pusty kadr)
   → CLAMP wejścia głównych elementów ≤35–50% dur w capacity-bar/bus-gauge
   (sync zostaje, scena nie stoi pusta). 4 flagi audytu f30 = znana klasa
   przewiewnych typów blisko progów (timeline/markers/terminal/bus-gauge) —
   backlog rekalibracji progów per typ.
-2. **[ZROBIONE 2026-08-29 po poł., decyzje delegowane]** (a) PROMPT: zostaje
   v3+13b (10.6k zn.; semantyka z recenzji + per-typ "zwykle ≤2" + zakaz gołych
   kart). WNIOSEK Z 3 POMIARÓW: pierwsze podejście ma wysoką wariancję (13→10→9
   typów — stochastyka), bramka-retry KONSEKWENTNIE domyka do 12–14/≈0 flag →
   bramka+retry to właściwa architektura, koszt ~20k tok. akceptowalny; wojna
   o "pierwszy strzał" nieopłacalna. Bramka: cap uogólniony na KAŻDY typ >3.
   (b) NOWE BUILDERY P1 wdrożone: pula 22→25 (`fabryka/komponenty-oxz.mjs`:
   capacity-bar z OVERFLOW i floating-tagami, checklist z przyciskiem-CTA,
   bus-gauge z kropkami; adnotacjaTag = współdzielony prymityw; rejestr SVG
   `fabryka/assets/logos|icons` + logoSVG() w komponenty.mjs, pole `logo`
   w bar-rows/capacity/bus). Fixtury 25 scen (bramka 1 ✓), stress f27 25 scen
   (check ✓), demo f29-nowe-p1 wysłane (51s), strona przeglądu ma sekcję NOWE.
   Po drodze: RUNTIME count wymaga from/to (NIE `do` — NaN!); html.replace()
   przy składaniu wielu pasków = bug klasy "pierwsze wystąpienie".
   SCENOGRAF NIE ZNA jeszcze nowych typów (schemat wciąż 21) — rozszerzenie
   schematu+promptu o P1 = następny krok na "go" (albo po akceptacji demo).
   P2 (formula-card, price-card, cluster-link, metaphor-lib, cta-endcard)
   i P3 (thought-bubble, delta-arrow, rozszerzenia) — backlog w analizie.
-1. **DECYZJE USERA (rozstrzygnięte wyżej / nieaktualne):**
   (a) Prompt v3 po erracie 13 (odchudzenie wg recenzji codexa): pomiar pokazał
   trade-off — 1. podejście SPADŁO do 10 typów (product-card×4, 2 flagi gołych
   kart), bramka-retry uratowała finał (12 typów/0 flag, koszt 2×). Propozycja
   na stole: errata 13b = jedna linijka "każdy typ zwykle ≤2 na film" + trzeci
   pomiar. CZEKA NA DECYZJĘ (v3 z bezpiecznikiem / powrót do v2.5 / 13b).
   (b) Analiza wideo OXZ14OErwOw (analiza_OXZ14OErwOw.md): w wideo NIE MA
   fotografii — "obrazki" to wektorowe LOGA marek + piktogramy + parametryczne
   mini-ilustracje, zachowujące się jak typografia (prefiks tekstu, currentColor,
   ten sam glow). Rekomendacja: rejestr assets/logos+icons SVG + pole logo/icon
   w istniejących builderach (NIE pipeline zdjęć). Nowe buildery wg priorytetów:
   P1 capacity-bar (~20 plansz w źródle!), bus-gauge, checklist, annotation-tag
   jako współdzielony prymityw; P2 formula-card, price-card, cluster-link,
   metaphor-lib, cta-endcard; P3 thought-bubble, delta-arrow + rozszerzenia
   hero/flow/ring/product. CZEKA NA "go" przed implementacją.
0. **[ZROBIONE 2026-08-29, "zrób porządek"]** Grawitacja bezpiecznych typów
   i chude wnętrza naprawione U ŹRÓDŁA: errata 10 (procedura doboru:
   sygnałowe→robocze, hero-stat ≤2) + errata 11 (minima wnętrz per typ),
   prompt v2.4 od codex1 (11.7k zn.). POMIAR na gęstym scenariuszu
   (`videos/f26-proba-promptu/film.json`, sam film.json — katalog-próba bez
   init): pierwsze podejście 13 typów / 0 retry / 0 flag / 22k-13k tok.
   (v2.3 dawał: 5 typów, hero-stat×7, 5 flag chudości, koszt ×2 z retry).
   Bramka jakości rozkładu (monotonia+chudosc, zawsze, retry ×2) zostaje
   jako bezpiecznik. Jedna próbka — stochastyka, stąd bramka na stałe.
   DOGRYWKA: v2.4 wprowadził regres JĘZYKA (polskie plansze przy EN lektorze
   — pomiar "0 flag" był ślepy na język; złapane dopiero na przeglad.jpg
   po renderze) → errata 12 (język plansz = język LEKTORA), detektor
   diakrytyków w bramce (funkcja jezyk() w ocena()), prompt v2.5. FINAŁ:
   f26-v24 wysłany — 20 scen / 14 typów / EN / 5m08s; 5 flag audytu to
   przewiewne Z NATURY typy blisko progów (markers/timeline/product-card/
   verdict 2 checki/bar-rows 24.4≈26) — kandydat: rekalibracja progów
   audytu per typ, nie treść.
1. **[ZROBIONE 2026-08-29 rano]** pętla e2-v21: codex1 przepisał prompt v2.1
   (8.1k znaków), scenograf NA CODEX1 dał nowy rozkład (hero-stat / title-card /
   compare×2 / verdict-stack), świeże TTS z poprawkami walut/RAM, f22 v10
   wyrenderowane przez obie bramki. Po drodze naprawiona klasa błędu: errata
   obiecywała globalną `puentę`, composer renderował ją w 4 typach → teraz
   title-card i hero-stat też ją renderują, walidator akceptuje globalnie.
   Została 1 flaga treściowa: s05/verdict 11.2%<13 (chude checki od LLM).
2. **[ZROBIONE]** Napisy: fork grupowania (`fabryka/captions-fork.mjs`, scalanie
   26–52 zn., 43→28 grup na f22), pille 80% szerokości; podłoga podniesiona do
   1.5cqw/28px i egzekwowana bramką; puenta przeniesiona nad pas napisów (71cqh,
   pasy treści rezerwują miejsce). f22 v11 przeszła przegląd przedwysyłkowy.
3. **[ZROBIONE 2026-08-29]** Pełna paleta + pokaz 22/22: (a) schemat scenografa
   12→21 typów (errata v2.3, prompt przepisany przez codex1; aliasy → mapa
   plików); (b) f24-pokaz-22 = ręczny film ze WSZYSTKIMI 22 builderami na
   treści M5 (2m32s, check czysty, wysłany). Rundy checka f24 naprawiły w
   builderach: glitch-hit strefy (30/64cqh), timeline rok nad etykietą
   (34.4cqh — kolizja po global font bump), prop-card zwężony + label poza
   białą kartą (52–98cqw @66cqh), before-after szerokość wnętrza wipe
   96→50cqw (treść była przycinana), tier-header AUTO-FIT tytułu (170/len,
   max 10.5cqw); repochad-dark +pink/cyan/cream (schemat obiecywał 9 akcentów,
   skin miał 6 — cichy fallback na green). Bramka różnorodności wzmocniona:
   cel = min(12, 60% plansz) w trybie testowym, retry ×2 z listą NIEUŻYTYCH
   typów, hero-stat max ×2 (lekcja f25 v1: cel 4/20 przepuścił hero-stat×6).
4. **[ZROBIONE 2026-08-29]** f25-gesty = scenograf v2.3 na GĘSTYM transkrypcie
   (20 linii z pełnego whispera, `e2/scenariusz_repochad_gesty.txt`): 20 scen,
   12 typów (5 nowych: camera-world, type-beats, before-after, sampler-stat,
   terminal), 5m08s, wysłane. Bramka różnorodności MUSIAŁA zadziałać: 1. podejście
   LLM = 5 typów, hero-stat×7 — dopiero retry z listą nieużytych dał 12. Rundy
   checka utwardziły buildery na dane LLM: crosslbl chart-threshold przerzucany
   POD punkt gdy próg≈maxY (badge-kolizja), payoff verdict-stack AUTO-FIT
   (165/len, było zawijanie w pas napisów). ZOSTAŁO 5 flag treściowych audytu
   (chude wnętrza od LLM): s09 jedna karta, s14 leaderboard 2 wiersze,
   s17 cards-list bez punktów, s13/s15 chart bez puent — kandydat na erratę 10
   (minima wierszy/punktów per typ) albo decyzja usera.
5. **[ZROBIONE 2026-08-29]** Pokaz wariantów (f22 v13): errata v2.2 (pkt 6–8:
   zn w checks, heurystyki treść→typ, tryb testowy różnorodności), codex1
   przepisał prompt, scenograf z `--wymus-roznorodnosc` dał 5 scen = 5 typów
   (hero-stat/ring-gauges/flow/compare/bar-rows), audyt PIERWSZY RAZ 0 flag,
   wysłane (34 MB pełny + 7 MB kompakt, limit uploadu zdalnego 30 MiB).
6. **[ZROBIONE 2026-08-29]** Regres "cisza w środku" (f22 v11, 41–56 s): silnik
   TTS wyrzucił linię 03 z meta jako non-fatal anomaly (wav był dobry, proces
   kokoro wyszedł niezerowo) — patrz PUŁAPKI. Naprawa fabryczna: BRAMKA AUDIO
   w generuj.mjs + BRAMKA CISZY w przeglad.py; f22 v12 wyrenderowane, 5/5
   głosów, przegląd zielony, wysłane.
7. **[ROZWIĄZANE 2026-08-29 wieczorem — bez matura-alignmentu!]** Rozdział
   napisów od TTS okazał się NIEPOTRZEBNY dla walut: Kokoro robi REVERSE-
   NORMALIZACJĘ w timestampach ("two hundred dollars" wraca jako token
   "$200"), a rozbijała ją tylko kropka zdania wessana do liczby przez
   regex wygładzacza ("$2,499." → "2,499. dollars" → pauza+„Dollars").
   Fix kropki w lektor-tts.mjs (liczba kończy się cyfrą, interpunkcja za
   słowem, 7 testów) naprawił JEDNOCZEŚNIE: pauzy w głosie (zgłoszone
   przez usera jako "nie da się słuchać") i napisy (pokazują "$4,800",
   zero "Dollars"). Jednostki: words mieszane ("128GB" sklejone,
   "gigabytes per second" słownie) — spójne z tym, co słychać, OK.
   Matura-style 1:N alignment zostaje w zanadrzu, gdyby przyszłe reguły
   rozwijające nie miały reverse-norm.
8. Backlog stylu (NOTATNIK „Do zrobienia"): akumulacja-z-reflow jako mechanizm
   ogólny, tabela dotted-leader, stacked-allocation-bar, gauge z tickami,
   seam-cuts z cut-catalogu; flagi-backlog: timeline/markers/terminal-demo/
   before-after/caption-specimens (przewiewne — dogęścić przy okazji); flaga
   s05/verdict 11.2%<13 (chude checki od LLM) wraca w v12 — zgłoszona userowi.
9. f21 (rate limiting, scenariusz w `scratchpad/e2-pelny.sh` [3/4]) — po resecie limitów.
10. Port do wytwórni (E1+E2 zielone): komponenty→slajdy.mjs, plansze v2 do
   scenografa, whisper na kotwice — TYLKO na wyraźne „go" usera.

## Metryki nocy

20+3 filmy wyrenderowane (wszystkie check-passed) · 22 buildery · 9 skinów ·
2 bramki QA · prompt+2 przebiegi scenografa ≈ 40k tok. wejścia LLM łącznie ·
render 41s ≈ 55 s na M-serii.

## ZASADA ŻELAZNA (user, 2026-08-30 noc — "JAWNE ZŁAMANIE MOICH ZASAD")
Ręcznie wolno dotykać: silnika (buildery/generuj), bramek, doktryny
(DYDAKTYKA), briefów i schematów. NIGDY: danych scen, treści plansz,
film.json, kotwic — wyjść pipeline'u. Każda ręczna poprawka wyjścia
= podrasowany dowód i złamanie zasad usera. Gdy wyjście jest złe:
przekuj obserwację w bramkę/regułę/erratę i przepuść przez system
ponownie. Jeśli system nie dociska — to jest wynik; iteruj system.
(Kontekst: chirurgia s09/s12/s16 w r01 v4 — wycofana, film.json usunięty,
r01 regenerowany pipeline'em od zera.)

## META-LEKCJA (2026-08-30 ~04:00): recenzja promptów ≠ darmowa
Dwukrotnie ta sama klasa regresji po recenzji krzyżowej codexa: (1) REDAKTOR
stracił przykłady → 0/68 poprawek; (2) REZYSER skompresowany 9.4k→6.7k →
plan z JEDNĄ sceną na 68 linii (scenograf bez reżyserii, 33 flagi, zero
motywu). Kompresja promptu behawioralnego wycina kalibrację. Reguły:
(a) po KAŻDEJ zmianie promptu weryfikuj WYJŚCIE etapu (liczba poprawek
redaktora, pokrycie planu), nie tekst promptu; (b) bramki semantyczne w
kodzie: pokrycie planu ≥80% linii + ≥2 filary → retry reżysera ×3 → STOP
(w scenograf_run); (c) w zadaniu recenzenta jawne zakazy usuwania sekcji
kalibrujących. REZYSER.md.po-recenzji zachowany do porównań.

## STAN BATCHA + PUŁAPKA PIPE (2026-08-30 rano)
- r01 ✓ dostarczony (plan compare-heavy — wariancja reżysera, patrz niżej).
- r02 ✗ UBITY bramką ciszy (3.2 s martwego audio: sklejone części 0.9-sekundowej
  linii s35 → sceny bez głosu). Znana dziura: odmowa podziału zostawia nieme
  sceny-części. Poranna fala: wykonalność podziałów liczona PO TTS (twarde
  sekundy), nie z len/15; odmowa musi usuwać części z kompozycji.
- ffmpeg crash "-to -0.883" naprawiony (awaryjny MIN_SEG bez podłogi 1.8;
  <1.2 s/część = sklejka).
- PUŁAPKA ×5: `cmd | tail/grep` maskuje exit code (generuj/check/przeglad/
  scenograf/mój test). `set -o pipefail` dodany do batch_repro.sh (działa od
  NASTĘPNEGO startu batcha — bieżący bieg ma pętlę w pamięci). DO KOŃCA TEGO
  BIEGU: każde "OK [rNN]" wymaga ręcznej weryfikacji `python3 fabryka/przeglad.py
  videos/rNN-*` BEZ pipe przed wysyłką.
- SYSTEMOWE do porannej fali: (a) plan-quality gate — reżyser produkuje
  compare-flood (r01: compare×17, r03: compare×9, zero motywu) → bramka:
  wymagany motyw ≥4 scen + cap compare ~25%; (b) prompt↔bramki DRY (sekcja
  kontraktu generowana z definicji bramek); (c) język: polskie kickery bez
  diakrytyków ("Koszt dostrajania") przechodzą detektor diakrytyków.

## RECYDYWA PRZEKREŚLEŃ (2026-08-30 ~08:00) — user wściekły, słusznie
Scribble w markers dalej ciął glify (f30 @1:26 zgłoszone → "fix" y 62–72
liczony arytmetycznie NIE zweryfikowany klatką → wróciło w r03 @0:06).
Teraz: scribble = 2 kreski POD literami (y 79/84 w viewBox 96), nowrap na
wyróżnieniu, silnik wymusza spacje wokół highlightu ("ofdeveloper" bug).
ZASADA: zmiana wizualna buildera BEZ wyrenderowanej klatki kontrolnej nie
istnieje. Render próbki + oględziny obowiązkowe przed powrotem na taśmę.

## Feedback usera 2026-08-30 rano (wdrożone/parkingi)
- Obwódka (kolo) pudłowała → geometria rozciągana do boxu słowa
  (preserveAspectRatio=none, viewBox 200×96). WYMAGA klatki kontrolnej
  przy najbliższym filmie z markers/kolo.
- NAPISY WYŁĄCZONE w reprodukcjach (wzorzec ich nie wypala; karaoke
  rozpraszało) — scenograf_run pisze napisy:false; generuj to wspiera.
  Stare projekty bez zmian (domyślnie ON).
- PARKING: "TTS źle czyta kropki w liczbie" — w words meta brak śladów
  rozcięcia dziesiętnych (tylko prawdziwe końce zdań po liczbie:
  "46.2. On"). Potrzebny repro z timestampem od usera zanim ruszymy
  wygładzacz (ślepa reguła "N point M" psułaby tokeny napisów/kotwic).

## FALA F2 WDROŻONA + A/B r04 (2026-08-30 ~10:30)
User: STOP batch → "puść naprawę na jednym, zobaczymy czy LLM zdecyduje".
Zrobione: 5 builderów F2 (komponenty-f2.mjs: bench-table, param-grid, funnel,
layer-wall, dial-gauge) — wszystkie po sondach klatkowych na f00 (3 iteracje:
rozrzut kropek mnożnik 79, tarcza statyczny wycinek zamiast draw, podpis pod
pierścieniem; PUŁAPKA: sonda MUSI mieć generuj przed renderem — render czyta
upieczony index; --quality medium NIE istnieje → draft). Schemat 28 typów
(markers WYCOFANY na stałe — decyzja usera po 3 rundach napraw zaznaczeń;
alias wiersze_bench→wiersze), POLA/heurystyki/DYDAKTYKA R9b, erraty 23-24,
prompty przepisane przez codex1. Side-by-side generator:
fabryka/e2/side_by_side.py (STORYBOARD→pary klatek nasz/oryginał czas
proporcjonalny). NAPISY OFF w reprodukcjach (napisy:false w film.json).
A/B r04: param-grid + layer-wall użyte SAME w scenach 1:1 jak wzorzec;
flow×12 (powódź W PLANIE) → BRAMKA POWODZI PLANU (typy-kleje
flow/compare/checklist/cards-list/product-card ≤ max(3, 20% scen) w retry
reżysera ×3). first-shot KPI drukowany per film. Batch ZATRZYMANY po r06
(r05 wyrenderowany 20:30 min, czeka na dostawę-ścieżkę lokalną; r06 z
napisami-legacy 27M gotowy niewysłany). Czeka na WERDYKT USERA po A/B:
wznowić batch r05..r14 pełnym stosem czy dociskać dobór.

## WYKONANIE PLANU NAPRAWY (2026-08-30, plan zatwierdzony po recenzjach)
Plan: ~/.claude/plans/orginal-jest-o-wiele-silly-truffle.md (analiza 36 scen,
klasy D/N/B/X/P, luki L1-L12, fale 0/A/B/C/D/E + rewizja codex WIĄŻĄCA).
- FALA 0 ✓: enum rezyser.schema +F2/−markers (DYMIĄCA LUFA POTWIERDZONA:
  sam enum zmienił plan z "flow×7, zero F2" na "bench-table×5, layer-wall×2,
  param-grid, funnel; flow→3" — test --tylko-plan, plan_r04test.json);
  markers-zero w scenograf_run/DYDAKTYCE; mapowanie reprodukcji +F2;
  flaga --tylko-plan.
- FALA A ✓ (OSTRZEGAWCZO, bez retry — rewizja pkt 2): fabryka/e2/relacje.py
  (FORMY, KLEJE, klasyfikuj(), tabela_md() — jedno źródło), diagnostyka() w
  scenograf_run (klasy [degeneracja]/[dobór]/[f2-minimum], flagi
  "DIAGNOSTYKA (ostrzegawczo)"), promocja do retry DOPIERO po kalibracji.
- FALA B ✓: relacja_danych (enum płaski) w schemacie planu; «TABELA_RELACJI»
  wstrzykiwana z relacje.py (fallback gdy brak placeholdera); briefy: relacja
  przed typem, złoty przykład param-grid ZAMIAST flow, zakaz klei w
  typ_obowiazkowy, anty-bloat (przykłady>reguły); pisz_prompt_rezyser z dwoma
  placeholderami; prompty zregenerowane + asserty (tabela ✓, przykład
  param-grid ✓, markers tylko jako 1-liniowy zakaz).
- RERUN#1 r04 W TOKU: plan z relacjami, film: F2×5 (param-grid, layer-wall,
  funnel, bench-table×2), flow 12→7 (21%), 16 typów; uparte: s09 filar
  z nakazanym capacity-bar wypełnianym tautologią (kalibracja Fali B);
  POLA+podpis_kotwica naprawione. Po renderze: side-by-side + delta [D].
- NASTĘPNE: delta-raport → FALA C (wspierajace[] JEDEN obiekt, rewizja pkt 4)
  → RERUN#2 → FALA D (slot-strip wariantowany, branch-diagram; cta-endcard
  na końcu) + E (motif_id) → RERUN#3 + HELD-OUT (r07+, bez strojenia).

## SZYBKA ŚCIEŻKA (rozkaz usera: "ŻADNYCH nulli, ŻADNYCH retry", 2026-08-30)
- KOPERTA: plansze-v2.schema.json = generator {scena,typ,kicker,akcent,
  dane(string JSON pól typu),przejscie?,start_kotwica?}; pełny schemat →
  plansze-v2.walidator.json (walidacja po scaleniu, flagi). rozpakuj_dane()
  przed bramkami; SUFIKS_KONTRAKTU dokleja format do promptu porcji; zły JSON
  w dane → flaga KOPERTA (bez retry). Powód: strict-mode mostu (nietykalny)
  wymuszał ~66 nulli/planszę → ×3 na czasie generacji.
- ZERO RETRY: pętle reżysera (×3) i porcji (×2) USUNIĘTE; proby=1 wszędzie
  (scenograf_run, redaktor_run). Wady planu/porcji = głośne flagi w raporcie.
  Jedyny sys.exit: reżyser nie zwrócił planu wcale.
- POMIAR: etap LLM r04 2:34 (było 15–25 min); generuj z TTS 1:47; film
  end-to-end ~12 min. first-shot KPI = jedyna miara (retry nie istnieje).
- RERUN#2: dobór trzyma (bench-table×3, param-grid, layer-wall, flow 21%);
  kompozycje wspierajace: adopcja 1/32 → NASTĘPNA DŹWIGNIA: złoty przykład
  z wspierajace w prompcie scenografa (errata 26 wymaga, prompt ma sekcję —
  zweryfikować obecność przykładu, ewentualnie 1 regen). Strefa wspierających
  schodzi na 52cqh przy capacity/bus (kolizja z licznikiem naprawiona).
- Tautologia s09 (512/512) = flaga bez naprawy (zero-retry) — kandydat na
  wzmocnienie kontraktu capacity-bar w prompcie, nie na pętlę.

## FALA CHOREOGRAFII (user: "weź się za to na porządnie", 2026-08-30)
Diagnoza po odrzuceniu RERUN#2: przewaga wzorca siedzi w WYKONANIU scen
(ciągły ruch z narracją), nie w doborze — nasze sceny były statyczne po
jednorazowym wejściu. Wdrożone (silnik, deterministyczne):
- flow: strzałki RYSOWANE (draw), fokus narracyjny (poprzedni węzeł dim→0.45,
  finał przywraca + re-pop ostatniego);
- compare: lewa dim przy wejściu prawej, werdykt przywraca;
- before-after: PRZED dim po wipe, oddech PO na finał;
- timeline: kamień i-1 dim przy i, powrót przy 0.85dur;
- capacity-bar: licznik "X/poj" NABIJA SIĘ (count) do sumy segmentów;
- bench-table: przegrane wartości dim po ringu zwycięzcy;
- product-card: oddech karty @0.55dur + jitter pigułki (żywa ręka).
Weryfikacja: SONDA TEMPORALNA (3 klatki jednej sceny = 3 różne stany) —
nowa obowiązkowa forma sondy dla zmian choreografii (statyczna klatka
nie widzi ruchu; lekcja: dlatego moje "delty" wyglądały dobrze, a film nie).
Pozostałe buildery do objęcia falą przy następnej iteracji: cards-list,
checklist, leaderboard, ring-gauges, bus-gauge, layer-wall/param-grid
(mają już wave-entry), glitch/type-beats (plakaty — celowo statyczne).
KOLEJNE DŹWIGNIE wg planu: adopcja wspierajace (przykład w prompcie),
fale D (slot-strip, branch-diagram) i E (motif_id) — po werdykcie usera.

## SONDA CZ.2 → 3 REALNE BŁĘDY NAPRAWIONE (2026-08-30)
1. WYCIEK "undefined" NA EKRAN (5 scen r04): koperta czyni pola opcjonalne
   nieobecnymi → template literal wypisywał "undefined" (product-card annot/pill,
   verdict-stack pill, cards-list sub). Fix: guardy `p.x?.tekst` u źródła +
   STAŁA BRAMKA w generuj.mjs (skan HTML klatki o literalne undefined/null/NaN
   → "⚑ WYCIEK", bez retry). Lekcja: koperta wymaga guardów na KAŻDYM polu
   opcjonalnym w builderach — bramka łapie przyszłe.
2. before-after: big text 6.5cqw wychodził za lewą krawędź ("ixed scale factor").
   Fix: padding 2.5cqw + text-align:center + text-wrap:balance + auto-fit
   fsBig=min(6.5,max(3.4,68/najdłuższe_słowo)). Uwaga: css jest const w builderach
   — fsBig liczony PRZED deklaracją (test-rozmiary złapał Assignment to constant).
3. compositions/frames zbierał osierocone klatki starych generacji (91 plików
   przy 32 scenach — mylą sondy). Fix: generuj czyści *.html przed zapisem.
SONDA Z KOMPENSACJĄ NAKŁADEK: suma data-duration ≠ długość mp4; nakładka
przejścia ov=(suma−mp4)/(n−1)≈0.49s; realny_start(i)=cumsum−i·ov. Bez tego
sondy późnych scen trafiają w sąsiednie (fałszywe wyniki).
r04 v4 dostarczony (kompakt 14M + arkusz 3 faz before-after).

## AUDYT CODEX (2026-08-30, na zlecenie usera po werdykcie "duzo gorsze")
Pełny raport: fabryka/e2/ANALIZA_CODEX_2026-08-30.md (bilans: 26 scen słabszych,
3 równe, 3 lepsze). Dwie klasy przyczyn:
1. REGRESJA CHOREOGRAFII (błąd silnika): `pop` = fromTo(opacity:0→1); GSAP
   immediateRender ustawia stan OD t=0 → powtórny pop na widocznym elemencie
   UKRYWA go do swojego czasu. Efekt: karta produktu niewidoczna do 55% sceny,
   prawa połowa before-after pusta do 82%, ostatni węzeł flow znikał, pas
   layer-wall niewidoczny do tW. FIX: nowy prymityw `pulse` (tylko scale,
   fromTo{scale:1}→s0 yoyo) + wymiana 4 destrukcyjnych popów (komponenty.mjs
   product-card, extra flow-finał, extra af-in, f2 layer-wall). ŻELAZNA REGUŁA:
   powtórna animacja widocznego elementu NIGDY przez pop/fadeIn/fadeUp/tiltIn
   (wszystkie robią fromTo z opacity) — tylko pulse/dim/move/jitter/glitch.
2. TWARDE BŁĘDY DANE↔BUILDER: (a) wygrywa w bench-table przychodzi jako NAZWA
   kolumny, builder porównywał z indeksem → zero podświetleń zwycięzcy w całym
   r04; fix: wygrIdx() nazwa→indeks. (b) param-grid nie renderował liczb
   total/aktywne (tylko etykiety); fix: fmtN + dopisanie liczby gdy etykieta
   bez cyfr. (c) annot/pill przychodzą jako STRINGI — guardy je chowały;
   fix: koercja koperty w buildFrame (string → {tekst}) — treść wraca na ekran.
POZOSTAŁE KROKI PLANU CODEXA (3–10: relacje precyzyjne w schemacie reżysera,
bloki przykładów do REZYSER/SCENOGRAF [gotowe teksty w raporcie], nowe formy
slot-strip/branch-diagram/expert-map/cta-endcard, wspierajace jako sloty layoutu,
cap type-beats ~5.2cqw, motyw_id, audyt 25/50/75%) — decyzja usera; wymagają
drugiego (ostatniego) regen promptów i nowego przebiegu LLM.

## WDROŻENIE PLANU CODEXA W CAŁOŚCI (user "go", 2026-08-30)
Raport źródłowy: fabryka/e2/ANALIZA_CODEX_2026-08-30.md. Stan: kroki 1-10 wdrożone.
- [SCHEMAT] relacje.py: PRECYZYJNE relacje (wzrost_nieliniowy, czesc_calosci,
  limit_budzetu, topologia, transport_pamieci, proces_liniowy, utrzymanie_stanu,
  wyniki_niezalezne, ranking, tradeoff, cta) → po 1-2 formy; klasyfikator
  ostrzegawczy przepisany. rezyser.schema: nowy enum relacja_danych + motyw_id.
  Koperta+walidator: 4 nowe typy (slot-strip, branch-diagram, expert-map,
  cta-endcard) + kontrakty pól + strefa w paskach capacity.
- [PROMPT] Erraty: BRIEF_rezyser UZUP.8 (kalibracja relacji przykładami codexa
  verbatim + motyw_id), BRIEF_scenograf ERRATA v4.2 (4 kontrakty + "Cztery
  przykłady pełnej kompozycji" verbatim + zamiana ogólników na przykłady).
  Regen OBU promptów przez codex1 — wszystkie kotwice asercji weszły za 1. razem.
- [SILNIK] komponenty-d.mjs: 4 nowe buildery (klatki kontrolne OK — arkusz
  proba_d). bench-table: wynik jako DŁUGOŚĆ (mini-paski względem maksimum wiersza,
  z-index pod tekstem). capacity-bar: strefa {wartosc|frakcja,label} = granica
  native→scaled. type-beats: cap 5.2cqw (koniec plakatów 8.5). wspierajace:
  DOMSLOT — dominanta zsuwa się transformem (scale .8/.76, origin wg stref),
  wspierający dostaje WOLNY pas (koniec nakładek). motyw_id: generuj wymusza
  akcent pierwszej sceny motywu.
- [BRAMKA] generuj AUDYT (flagi bez retry): podwójne wejścia opacity per sel
  (złapał przeoczony dubel w param-grid!), pusty początek >45% dur, tautologia
  capacity bez strefy, wygrywa niepasujące do kolumn, brak liczby total w treści.
  POPRAWKA strip skryptów w bramkach: /<script\b[^>]*>[\s\S]*?<\/script>/g
  (cięcie od PIERWSZEGO <script zjadało treść — fałszywe flagi).
- ZASADA WEJŚĆ (z audytu): element wchodzi RAZ (pop/fadeIn/fadeUp/tiltIn);
  aktywne/zapalane elementy wchodzą w SWOJEJ kotwicy zamiast fadeIn+dubel;
  powtórna animacja widocznego TYLKO pulse/dim/move/jitter.
- Film sondażowy: videos/_proba_d (8 scen, wszystkie nowości, check passed).
- RERUN#3 na r04 w toku (świeży LLM na nowym kontrakcie); film.v5.json = backup
  poprzedniej wersji do A/B.

## RERUN#3 (pełny plan codexa, 2026-08-30 wieczór)
Świeży przebieg LLM na nowym kontrakcie: 35 scen, porcje first-shot 2/2.
ADOPCJA: slot-strip(+wspierajace) / expert-map ×2 (para: pula→trasa, wzorzec
kalibracji) / branch-diagram (oś+bramki) / cta-endcard (ostatnia) / wspierajace
4/35 (było 1/32) / motyw_id 2 pary (cards-list "preserved-thinking", context-window).
POZOSTAŁY PROBLEM (LLM, flagi zero-retry): flow-bias 8/35 (>20%; s06 topologia
i s17 utrzymanie_stanu dostały flow mimo preferencji), s16 capacity tautologia
×2 bez strefy, s19 bench 1-wierszowy. Dźwignia na następny regen (OSTATNI wg
rewizji): przykład negatywny flow w kalibracji reżysera.
SILNIK dołożony w tej fali: chart-threshold etykiety linii NAPRZEMIENNE strony
(parzysta nad/nieparzysta pod linią, okno kolizji 340×170 px na obrócone boxy —
check s04 przeszedł); bramka audytu: wyjątek dla sel ze swap (type-beats).
cta-endcard wyrenderował "Subscribe to RepoChad" — treść z transkryptu ŹRÓDŁA
(reprodukcja wewnętrzna); przy własnej produkcji brand własny.
r04 RERUN#3 dostarczony (kompakt 15M + arkusz rerun3.jpg). film.v5.json = backup.

## FALA TABLIC — START (plan zatwierdzony, 2026-08-30 wieczór)
Plan: ~/.claude/plans/we-wzorcu-ja-widze-precious-mountain.md (diagnoza usera:
wzorzec DOKŁADA moduły do tablicy; 29 tablic × ~5,5 modułu vs nasze 1 typ/scena).
- F0 ZALICZONE: TTS 76 s jednym strzałem — words ciągłe, max pauza 0,40 s
  (próg 2,5 s). Sklejka linii PRZED TTS zatwierdzona (fallback concat zbędny).
- F1 RDZEŃ DZIAŁA: komponenty.mjs — tryb FRAG (buildFragment, stos
  COMPID/CURP/FRAG, guardy kicker/puenta, frameShell zwraca {css,html,ops}),
  op `shift` (fromTo y — seek-safe reflow), helper `faktura`, eksport
  `znajdzWord` (generuj importuje — jedno źródło); komponenty-extra: guardy
  jestFrag() w kick/puentaBlok + FIX duplikatu #id-world w camera-world (→-cw).
  komponenty-tablica.mjs: BUILDERS["tablica"] (okna linii po słowie
  charakterystycznym, kotwice zakresowane DO OKNA linii modułu, layout
  dwuprzebiegowy, klaster + shift-reflow centrowany, ring wyróżnienia gaśnie
  sam, filtr fragmentów drop{cam,dim,anchor}, scribble jako overlay z
  data-layout-allow-overlap) + prymitywy: zdanie-token, chip-row, dashed-tag,
  stat-inline(+strzałka), klamra, lookup-table; fragmenty przez FRAG_VIEW
  (okno pasa treści buildera). Fixtura tablicy w testy-fixtury (podłoga OK).
- Sonda videos/_proba_tablica (rekonstrukcja tablicy #10 wzorca, 2 linie
  lektora, 6 modułów): akumulacja + pigułki w zdaniach + 2 klamry z liczbami
  + reflow potwierdzone klatkowo; check 0 błędów. LEKCJA: licznik slot-strip
  nie miał opa wejściowego (widoczny od t=0) — naprawione fadeIn przy count.
- KAMPANIA W1 w tle: workflow 29 kart tablic + 4 recenzentów + agregator
  (fabryka/e2/kampania/; MAPA_TABLIC, arkusze, SCHEMAT_KARTY, lint);
  WARSZTAT-seed osobnym agentem (fabryka/e2/warsztat/).
DALEJ: F2 kontrakt+scenograf_run (grupowanie tablic), F3 erraty+JEDEN regen
(z placeholderami «KARTY_TYPOW»/«ZLOTE_TABLICE»), F4 RERUN r04.

## ⏸ WZNOWIENIE FALI TABLIC (zapis stanu przed końcem quoty, 2026-08-30 ~noc)

PLAN ZATWIERDZONY: ~/.claude/plans/we-wzorcu-ja-widze-precious-mountain.md
(tablice modułowe: tor SILNIK F0–F4 + tor KAMPANIA W1/W2; decyzje usera:
równolegle, split-screen zostaje z flagą, W3 po werdykcie RERUN).

### ZROBIONE I NA DYSKU (zweryfikowane)
- F0 ✅: TTS 76 s jednym strzałem OK (words ciągłe, max pauza 0,4 s) —
  sklejka linii PRZED TTS zatwierdzona. Probe: videos/_proba_tts50.
- F1 ✅: silnik tablic działa — komponenty.mjs (FRAG/buildFragment ze stosem,
  op shift, faktura(), znajdzWord eksport, guardy kicker/puenta, frameShell
  zwraca fragment), komponenty-extra (jestFrag() w kick/puentaBlok, fix
  #id-world→#id-cw w camera-world), komponenty-tablica.mjs (builder tablica:
  okna linii, kotwice zakresowane do okna, layout 2-przebiegowy, reflow
  shift, ring gaśnie sam, filtr drop{cam,dim,anchor}, scribble overlay;
  prymitywy: zdanie-token, chip-row, dashed-tag, stat-inline, klamra,
  lookup-table; FRAG_VIEW dla 13 typów). Sonda: videos/_proba_tablica
  (tablica #10, 6 modułów, check 0 err) — arkusz wysłany userowi.
- F2 ✅: rezyser.schema (tablica/podmiot), koperta (typ tablica), walidator
  (moduly[]), scenograf_run: POLA["tablica"], SCALANIE tablic (kolejne
  plansze wspólnego tablica_id → 1 scena, voiceover konkat, linie[] ze
  słowem charakterystycznym), snap porcji do granic tablic, bramki
  [tablica]/[anty-wzorzec], monotonia z wyjątkiem tablicy, iniekcja
  «KARTY_TYPOW»/«ZLOTE_TABLICE» na SZABLON (fallback gdy brak warsztat.py).
  generuj: audyt zapełnienia tablic (data-fill poza [0.6,1.0] = flaga).
- DYDAKTYKA: dopisane R1′ + R14–R18. BRIEF_rezyser UZUP.9 + BRIEF_scenograf
  ERRATA v5.0 (kontrakt tablicy + placeholdery) — GOTOWE DO REGENU (F3).

### W TOKU — ORKIESTRACJA (stan na moment zapisu)
1. WORKFLOW W1 (29 kart + 4 recenzentów + agregator):
   - runId: wf_db4db7b6-c04
   - script: ~/.claude/projects/-Users-gileneo-www-new-misc-identyfikacja-yt/a6915693-1d45-4930-9be3-678a1ae8ac36/workflows/scripts/kampania-w1-karty-tablic-wf_db4db7b6-c04.js
   - WZNOWIONE (po powrocie quoty): karty z cache, fazy Recenzja+Agregat
     w toku. Ponowne wznowienie tą samą komendą resumeFromRunId gdyby padło.
   - KARTY NA DYSKU: ✅ 29/29 (fabryka/e2/kampania/BAo5/tablice/),
     kampania_lint.py: WSZYSTKIE CZYSTE. Recenzje i agregat: NIE ruszyły —
     WZNOWIENIE STARTUJE OD FAZY RECENZJA (resume z cache przeskoczy karty).
   - Gdy resume niemożliwy: dokończ ręcznie 5 kart wg
     fabryka/e2/kampania/SCHEMAT_KARTY.md (arkusze: kampania/BAo5/arkusze/,
     mapa: MAPA_TABLIC.yaml + MAPA_LINIE.txt, lint: kampania_lint.py),
     potem 4 recenzentów (paczki T01-08/09-15/16-22/23-29, spot-check ≥3
     wejść/kartę, poprawki w YAML + RECENZJA_N.md) i agregator
     (lint całości → STATY.json + AGREGAT.md + wybór 5 złotych tablic).
2. WARSZTAT-SEED: ✅ GOTOWY (49 kart w fabryka/e2/warsztat/ — w tym
   dopisana ręcznie tablica.yaml; warsztat.py działa: karty_typow() 11,9k zn.
   w budżecie ≤12k, progi_bramek() 49 modułów, lint zielony; WARSZTAT.md
   z sekcją AUTO). BRAKUJE tylko: zlote_tablice() — dopisać po agregacie W1
   (3–5 kart z AGREGAT.md, format LEKTOR→KOMPOZYCJA + pełny JSON koperty).

### KOLEJKA PO WZNOWIENIU (kolejność)
1. Dokończ W1 (resume workflow) + WARSZTAT-seed; sprawdź STATY vs zwiad
   (liczności ±20%), złote tablice wybrane.
2. warsztat.py: dopisz zlote_tablice() (3–5 kart z AGREGAT, format
   LEKTOR→KOMPOZYCJA + pełny JSON koperty 2 linii tablicy #10).
3. F3: JEDEN regen OBU promptów przez codex1 (pisz_prompt_rezyser.py +
   pisz_prompt.py) + ASERCJE: rezyser zawiera „tablica"/„podmiot"/przykład
   kalibracji; scenograf zawiera „tablica_id"/„moduly" i DOSŁOWNE
   placeholdery «KARTY_TYPOW»/«ZLOTE_TABLICE» (iniekcja podmienia w runtime).
   Potem --tylko-plan na r04: plan ma grupować ~20–30 tablic z podmiotami.
4. F4: RERUN r04 pełny (scenograf_run --scenariusz fabryka/e2/
   scenariusz_BAo5dTyPxwg.txt --projekt videos/r04-BAo5dTyPxwg --film-id r04
   --tytul "<z film.v5.json>") → generuj --tts → check --timeout=60000 →
   render high → sondy temporalne tablic (3 fazy) → przeglad → kompakt →
   klip porównawczy vstack (przepis: ffmpeg setpts=oryg 315.6/nasz_dur,
   scale 1440:810, vstack) → dostawa z metrykami vs wzorzec (29 tablic /
   ~5,5 mod / ~85%).
5. Po werdykcie usera: W2 (werdykty per scena), F1.5 (moduły: toggle,
   slider, led-strip, legend, token-ribbon, memory-offload), W3 (delta 13
   filmów), batch r05–r14.

### PUŁAPKI DLA WZNAWIAJĄCEGO
- proby=1 wszędzie (ZERO retry), zero nulli (koperta), film.json nietykalny.
- Zmiany wizualne → klatki kontrolne (sonda z kompensacją nakładek
  ov=(Σdur−mp4)/(n−1)).
- cwd resetuje się między turami — zawsze absolutny cd.
- pipefail w łańcuchach; check 60 s dla 35 scen; probe cycle = generuj →
  render draft → extract → LOOK.
- kotwica() globalna szuka 1. wystąpienia — na tablicach używa się okien
  linii (komponenty-tablica), NIE zmieniaj globalnej semantyki.

## F4 DOSTARCZONY — pierwszy film na TABLICACH (2026-08-30 wieczór)
Świeży przebieg LLM na pełnym kontrakcie tablic: 28 plansz → 21 scen
(6 tablic po 2-3 linie: s01 5mod, s04 2, s08 5, s11 4, s13 3, s17 2 + 15
singli; wzorzec: 29 jednostek). First-shot 2/2 porcji, check 0 błędów,
cisza czysta. Sondy 3-fazowe: akumulacja + reflow działają (s08: layer-wall
→ slot-strip 512 + licznik 326→2048 w kadrze; s11: karty vs + lookup-table
+ flow + dashed; s17: łańcuch progresywny).
UTWARDZENIA SILNIKA z tego przebiegu (LLM-płynne payloady):
- buildFragment: try/catch (moduł rzucił → fallback treściowy, nie śmierć
  builda) + skan NaN/Infinity w html fragmentu → fallback; koercja modułów
  (annot/pill/puenta stringi → {tekst}; product-card z płaskich pól → card{}).
- Fallback: dashed-tag z REALNĄ treścią (card.tytul/gora.label/dol.wartosc…);
  bez treści → moduł pomijany (nigdy pigułka z nazwą typu).
- Fragmenty 1:1 (bez skalowania poziomego — geometria builderów jak w scenach;
  klaster 100cqw, globalne S ściska); okna FRAG_VIEW urealnione (param-grid
  h61, expert-map h60, flow 28/34 bez podsumowania — rolę puenty ma moduł);
  PAS_FRAG: klamra dziedziczy pas slot-strip/capacity (x0/szer).
- data-layout-allow-overlap na oknach fragmentów (bounding-boxy nie znają
  clippingu — fantomowe kolizje; realne łapie sonda wzrokowa). Podłoga
  klastra 17cqh (kicker). slot-strip: label/licznik w połówkach (max-width).
FLAGI przebiegu (zero-retry, do promptów/danych): product-card i
chart-threshold jako moduły z niepełnym payloadem (fallback zadziałał),
capacity 1M/1M tautologia, 3× anty-wzorzec split-screen (s06/s10/s23 single).
DALEJ po werdykcie usera: W2 werdykty per scena, F1.5 moduły (toggle/slider/
led/legend/token-ribbon/memory-offload), gęstość modułów ↑ (śr. 3,5 vs
wzorzec 5,5 — dźwignia: przykłady per-linia w promptcie), batch r05-r14.

## PILOT PROJEKTANTÓW (architektura V2) — WYNIKI (2026-08-30/31 noc)
Pivot zatwierdzony rozmową: LLM-agent PISZE KOD planszy (jak wytwórnia-recovered);
silnik = runtime ops + harness + wiedza. Infrastruktura: fabryka/pilot/
(harness.mjs — pętla plansza.mjs→wrapFrame→check→render→podgląd f1-f5+mozaika;
PILOT_BRIEF.md — kontrakt+gramatyka; VADEMECUM.md — wersja oszczędna 13,6k zn.).
Projekty: pilot/T{NN}-{a,b,c,d,e} (film.json+TTS gotowe; plansza.mjs od agenta).
WARIANTY (10 tablic A/B; trio T05/T14/T20 też C/D/E):
- A sam+pętla≤4 (Sonnet domyślny): śr. ~298k tok/planszę (255-411k), rundy 2-4.
- B wzór(klatki źródła)+pętla: śr. ~272k.
- C VADEMECUM+mozaika+≤2 rundy (Sonnet LOW): ~86k — ale JAKOŚĆ WYRAŹNIE NAJSŁABSZA
  (puste kadry, mikre elementy) — low effort obniża ambicję projektu.
- E ONE-SHOT (Sonnet LOW): ~86k — zaskakująco lepszy od C.
- D ONE-SHOT Sol gpt-5.6 medium przez codex1 (INNA PULA QUOTY): 31-47k/planszę;
  struktura ok, ale bez weryfikacji przechodzą wady (font jako [object Object]
  → fallback typografii; check to łapał, nikt nie poprawił).
JAKOŚĆ (sonda T05): A≈B > E > D > C. Pełne arkusze: scratchpad macierz_T*.jpg
+ ab_zbior_*.jpg (wysłane userowi).
ZNALEZISKA INŻYNIERSKIE od projektantów (do naprawy w silniku/harness):
1. kotwica() fuzzy-prefix: krótkie słowa ("in","to","a") fałszywie łapią
   późniejsze kotwice ("inside","token","answers") — 4 agentów wpadło,
   wszyscy obeszli przez znajdzWord+kursor chronologiczny. FIX: exact-first
   w kotwica() albo kursor domyślnie.
2. BUG RUNTIME: drugi op na wcześniej animowanym elemencie (pulse po fadeIn)
   ZAWALA czasy wszystkich późniejszych opów (T14-a wyizolował usunięciem
   opu z wyrenderowanego pliku). Podejrzenie: interakcja yoyo/repeat w pulse
   z pozycjonowaniem timeline. DO ZBADANIA PRIORYTETOWO.
3. words-drift: timestampy ogona przekraczają długość wav (T10: słowa do 32s
   przy wav 23,9s) — clamp dur-0.2 w harness/kotwicach.
4. draw nadpisuje stroke-dasharray (dashed→solid po animacji); round-linecap
   zostawia kropki-artefakty przy draw na rozciągniętym viewBox.
5. swap domyślnie mruga opacity (ukrywa element do swapu) — show:false ratuje.
6. Siatka podglądu 10-92% nie sięga finałowych beatów — agenci sami dociągali
   klatki ffmpegiem; dodać f6@98%.
7. Sol w sandboxie codex nie uruchomi node/ffmpeg (render za niego robi
   orkiestrator) i nie obejrzy obrazów — one-shot bez pętli wizualnej.

## PILOT — dogrywki C2/H/I i finalny ranking (2026-08-31)
Po rewizji USERA na wideo (nie stillach!): C/C2/D/E zdyskwalifikowane
(bohomazy: martwe liczniki, białe boxy poza skinem, statyczne plakaty od 0s,
puste 2/3 sceny). Dogrywki z KLATKAMI WZORCA w prompcie:
- H (low + 2 rundy + wzorzec, ~105k): wzorzec PRZYWRACA choreografię,
  ale low nadal daje drobne elementy i pustkę.
- I (MEDIUM + 2 rundy + wzorzec, ~121k): PRZEŁOM — jakość klasy A/B za 40%
  ceny; gęste, wierne wzorcowi, liczniki żyją (sonda 6-fazowa wszystkich 3).
RANKING KOŃCOWY: A≈B (272-298k) ≥ I (121k) > H (105k) > E/C2/C (82-86k)
> D (31-47k, inna pula). WNIOSEK: sekwencję daje WZORZEC przed oczami,
gęstość daje MEDIUM effort; pętla może być krótka (2 przebiegi + mozaika).
KANDYDAT PRODUKCYJNY: wariant I + (dla nowych filmów bez wzorca 1:1 —
karty tablic W1 jako "wzorzec opisowy" + złote klatki podobnych tablic).
Dalsze tanie dźwignie bez utraty jakości: paczki 3-4 plansz/agenta,
prompt-cache w SDK, timing-lint w harness (deterministyczny).
Strona przeglądowa (artefakt, 8 reżimów, wideo+wzorce+wejście B):
https://claude.ai/code/artifact/09f53439-2751-4916-9727-6e2d322748c7
(UWAGA: 14,1/16 MB — kolejne karty wymagają zdjęcia czegoś).
LEKCJA METODYCZNA (od usera, dwukrotnie potwierdzona): werdykty jakości
TYLKO z przebiegu wideo / gęstej sondy faz — stille zawyżają oceny.

## PILOT — ścieżka SDK (J/K/L) i metryka tokenowa (2026-08-31)
Metryka JEDNOLITA (rozkaz usera: tokeny, nie dolary; SDK = subskrypcja):
ŚWIEŻE = out + in + cache_w; odczyty cache osobno (ważą inaczej w limitach).
Przez claude1/2/3 -p --model sonnet (--effort X) --permission-mode acceptEdits
--allowedTools "Read Write Edit Bash(node *)" --output-format json (usage!).
- J (medium, 1 runda, wzorzec, claude1): 111/103/180k św. (śr. ~131k) —
  jakość klasy I; JEDNA runda wystarcza na medium.
- K (medium, 1 runda, BEZ wzorca, claude2): 150/98/123k św. (śr. ~124k) —
  własne kompozycje zaskakująco dobre (paski 1×/2× z HARD LIMIT; dwupanel
  matmul-vs-lookup) — medium+VADEMECUM wystarczają bez podglądu źródła.
- L (HIGH, 2 rundy, wzorzec, claude3): 142/244/226k św. (śr. ~204k) —
  najwierniejsze detale (mur z cegieł T05), bez skoku nad J/I wartego
  +55% ceny; czas 8-15 min/planszę.
SWEET SPOT PRODUKCYJNY: SDK Sonnet MEDIUM, 1 runda (J/K ~124-131k św./planszę,
prompt-cache zjada input), wzorzec-klatki gdy są (wierność), bez — gdy nie ma
(jakość trzyma). Klatki wzorca idą w pełnym 1920×1080 (API skaluje do ~1568px;
drobne podpisy → dokładać cropy-zoomy zamiast podbijać całość).
Strona przeglądowa: 11 reżimów, karty C/C2/D/E zdjęte po dyskwalifikacji
(wiersze w tabeli zostały), 13,1/16 MB.

## PILOT — wariant M i domknięcie macierzy SDK (2026-08-31)
M (SDK HIGH, 1 runda, BEZ wzorca, claude1): 132/118/129k św. (śr. ~126k) —
ŚWIEŻE IDENTYCZNE jak medium (K ~124k): wysoki effort pali odczyty cache,
nie świeże tokeny; płaci się CZASEM (+40%, 6-8 min/planszę). Jakość ≥ K
(dojrzalsze wykresy: żar pod krzywą O(N²), dashed MEMORY WALL; kompletne
puenty). MACIERZ SDK 1-rundowa: J(med+wzór)131k / K(med sam)124k /
M(high sam)126k — cena płaska, wybór wg jakości i czasu.
REKOMENDACJA PO PEŁNEJ MACIERZY (12 reżimów): potok V2 na SDK Sonnet,
1 runda; effort HIGH gdy czas niekrytyczny (M), MEDIUM gdy liczy się tempo
(J/K); wzorzec-klatki dokładać gdy istnieją (wierność bez dopłaty).
2. runda i pełne pętle (A/B/L) nie zwracają się w świeżych tokenach.

## WZORCOWNIA + MASÓWKA — system zbudowany i uruchomiony (2026-08-31)
Plan: ~/.claude/plans/go-i-poukladaj-to-woolly-emerson.md (zatwierdzony).
Produkt główny = KOD plansz pisany przez modele przy naśladowaniu wzorca.

### Zbudowane skrypty (fabryka/wzorcownia/)
- `02_granice.py` — detektor granic scen przez OCR kickera (tesseract przez pipe
  ffmpeg, 8 procesów, ~9 s/film). WALIDACJA na BAo5: **recall 0,89 · precision
  0,87 · kickery 0,83** (tolerancja ±3 s). DWA ODKRYCIA: (a) różnica pikselowa
  NIE działa (mediana 0,01 na granicy — kicker to mały tekst + crossfade ~4 s),
  (b) **detektor jest DOKŁADNIEJSZY niż ręczna MAPA_TABLIC** — GT spisany
  z klatek co 4 s zaniża granice (dowód: "REAL WORLD ENGINEERING TASKS" stoi
  na ekranie do 230 s, mapa mówi 226).
- `03_tnij.py` — sceny samowystarczalne: klatki co 2 s (max 10), wycinek mp4,
  linie lektora (pokrycie ≥40% segmentu), meta.json, BRIEF.md, KATALOG.jsonl.
- `04_szkielety.py` — TTS + pełny projekt HyperFrames bez plansza.mjs.
  REGUŁA TTS (user): sumarycznie <1 h → lokalny Kokoro na Macu; powyżej →
  kanoniczny moduł `:8772`. Fala 1 = 39,7 min audio → Mac. Zmiana silnika
  zmienia barwę głosu, więc jeden silnik na falę.
- `06_masowka.py` — orkiestrator: claim przez mkdir (atomowy), dziennik per
  worker, konto per worker (round-robin), regex limitu z llm_most, wznowienie
  po `.gotowe`, timeout 45 min, domykający harness gdy agent nie domknął.
- `PROMPT_NASLADOWANIE.md` — szablon z «PROJEKT»/«BLOK_WZORCA».
- PATCH `fabryka/pilot/harness.mjs`: korzeń repo szukany w górę (masówka trzyma
  projekty głębiej), clamp words do dur-0,2 (znalezisko pilota), f6@98%,
  semafor renderu (HF_SLOTY, mkdir-lock w .sloty/), pin HF_BIN.

### Struktura (segregacja scen — wymóg usera)
wzorcownia/<VID>/tNN/{meta.json,BRIEF.md,wzor/,szkielet/} · KATALOG.jsonl
przebiegi/<RUN>/<TID>/{plansza.mjs,renders/,podglad/,uzycie.json,raport.md}
TID = <VID>-t<NN> globalnie unikalny; worker pisze tylko do swojego katalogu.

### Stan
- Segmenty: 14/14 (6 dociągniętych z workera mini bez ruszania YouTube).
- Granice: 14/14 filmów. TRIAŻ po czytelności OCR: ≥0,95 → OXZ14(59) BAo5(32)
  psNf(75) MHsO(38) uaIL(32) q_gMB(17, podejrzany: śr. 54 s/scena); 0,76-0,84
  → EbQ7, 9CAZ; <0,65 → 8dXVf, bfdvv, IY5Fm, 7H6RH, FJKiX, kLar1 (screencasty
  / inny layout — poza falą 1).
- Fala 1 = 4 filmy (BAo5, MHsO, OXZ14, psNf) → 204 sceny, **173 do masówki**
  (≥6 s i z lektorem), wszystkie ze szkieletem+TTS.
- TEST 3 scen (reżim MW: high+wzorzec): 3/3 OK, 0 awarii, ~173k św./scenę,
  12 min przy 3 workerach. JAKOŚĆ: naśladowanie wierne, miejscami BOGATSZE od
  wzorca (t05: wzorzec mówi "both of these explode", nasze pokazuje dwie karty
  4× MEMORY / 4× LATENCY). Dowód: przebiegi/test-3/.
- **URUCHOMIONA FALA 1**: run `20260831-sonHI-1r-wzor`, 173 sceny, 12 workerów,
  3 konta. Szac. ~30M świeżych, ~2,5 h. Wznowienie: `06_masowka.py --run
  20260831-sonHI-1r-wzor --wznow`.

### Dalej
Po fali: strona przeglądowa (wzorzec↔naśladowanie), werdykt usera, potem
katalogizacja codexem (`zbierz.py` → paczki po ~10 kodów → baza/ELEMENTY.jsonl).

## Z pamięci Claude (przeniesione 2026-09-22) — dochodzenie RepoChad (2026-08-28/29)

Fakty z notatki pamięci Claude `repochad-style-investigation`, których nie było w tym pliku. Stan bieżący projektu
jest gdzie indziej: `README.md` wskazuje `HANDOFF-2026-09-02.md`; ten plik to historia do 2026-08-31.

- **Kanał.** RepoChad, channel_id `UCtyEhOTxGx45sljlfryc6jw`, ok. 1 tys. subskrypcji (2026-08-28), publikuje prawie
  codziennie. Według stanu z 2026-08-28 kanał przeszedł 2026-08-14 ze stockowego formatu „AI NEWS” na styl plansz.
  Późniejsza analiza 14/14 filmów pokazała, że oba formaty współistnieją (punkt -5 wyżej: A = explainer z planszami,
  B = AI NEWS jako tweet-reader).
- **Werdykt 2026-08-28.** Prawie na pewno agentowy potok HTML→wideo; najlepsze dopasowanie to HyperFrames
  faceless-explainer. Zgodne DNA: kreskowane słupki, count-upy, przerywane pigułki, mikro-etykiety kickerów, adnotacje
  w stylu Caveat, maszynowo cięte napisy karaoke w lewym dolnym rogu, głos TTS rozpoznany przez komentujących.
  Twórca tego nie potwierdził: dwa pytania o narzędzie w komentarzach zostały bez odpowiedzi.
- **Test odtworzenia (pierwowzór).** `videos/local-ai-break-even/` — projekt HyperFrames; preset broadside przerobiony
  na własny dark-neon (sekcja „Reference-style overrides (RepoChad test)” w `videos/local-ai-break-even/frame.md`),
  własna skórka napisów przy lewej krawędzi w `videos/local-ai-break-even/.hyperframes/caption-skin.html`, głos Kokoro
  `am_michael`. Wznowienie przez `/hyperframes` (w projekcie jest `BRIEF.md`).
- **Anatomia sceny i rundy stylu z 28–29.08** (odręczny tytuł z rysowanym podkreśleniem, puenta jako pełnoszerokościowy
  panel, jitter, SFX z biblioteki media-use): `fabryka/NOTATNIK_STYL_REPOCHAD.md`. Zasady usera z tego etapu są wyżej
  w „Doktrynach usera” (pkt 3: KISS dotyczy architektury, nie designu; pkt 4: flagę z audytu się naprawia, nie tłumaczy).
