188
🚨 nav.py wycenia bary PROXY jako `settled_daily_close` — guard istnieje, ale nie jest wołany · due weekly-2026-08-30 — Post-close 8/25: `nav.py::fetch_settled_closes()` woła `download_batch()`, który dla instrumentów z luką sesyjną URUCHAMIA ścieżkę naprawczą i rekonstruuje bar dzienny z 60-minutówek — a zwrócona cena dostaje `price_source: settled_daily_close` bez ostrzeżenia. Dziś dotyczyło to **czterech pozycji EU o łącznej wadze 49,8% NAV** (IB01.L 36,72% · 4GLD.DE 5,00% · ISLN.UK 4,46% · IUES.L 3,66%) na dniu **2026-08-24**, czyli na BAZIE dzisiejszego TWR. Błędy proxy raportowane przez sam helper: 1,6/7,0/8,8/9,9bp (p50) i 3,3/19,5/23,4/27,1bp (p95) → ważone NAV **1,7-4,2bp = $1,44-$3,60**. Skutek widoczny: dzienny ruch NAV (0,89bp) jest MNIEJSZY od tego błędu, a łańcuch ledgera (+0,0089%) i świeże przeliczenie obu końców (−0,0029%) dają **przeciwne znaki**. Guard `detect_session_gaps()` istnieje i validate_yaml raportuje go jako WARN — ale ścieżka licząca NAV go NIE woła. Naprawa: `fetch_settled_closes()` odrzuca bar proxy (fail-CLOSED) albo oznacza go `price_source: intraday_proxy` — pole już istnieje w modelu `Position` i `nav.py` renderuje dla niego flagę ⚠️ FALLBACK. ⚠️ DRUGA NOGA tego samego itemu, złapana w tym samym runie: `data/session_gaps.json` (artefakt, z którego validate_yaml czyta bramkę luk) NIE MA WŁAŚCICIELA W KADENCJI — dziś zapisał go open snapshot o 15:01 UTC i nikt go nie odświeżył do 22:30, więc walidator oceniał wieczorną książkę na porannym stanie danych (11 instrumentów wobec faktycznych 6 o 20:51 UTC). Post-close odświeża go od 8/25; do rozstrzygnięcia, czy to ma być krok w SKILL, czy wywołanie wewnątrz validate_yaml.
189
🔧 Sprzeczność KROK 5 post-close ↔ post_event.py — kto otwiera okno po druku AMC · due weekly-2026-08-30 — Post-close SKILL KROK 5 nakazuje przy druku AMC utworzyć blok `post_event_tracking` JESZCZE TEGO WIECZORA, z `session_count: 1`, `pre_event_close` = zamknięcie sesji regularnej i `cumulative_change_pct` liczonym na **handlu posesyjnym**. Tymczasem `post_event.py::window_state()` — uczyniony kanonicznym źródłem przez action #172 (»liczony, nie pamiętany«) — dla druku AMC kotwiczy się na zamknięciu dnia druku i liczy sesje od NASTĘPNEGO ROZLICZONEGO zamknięcia; wywołane dziś dla INTU rzuca `ValueError: zero sesji poeventowych — okno jeszcze nie istnieje`. Dodatkowo schemat wymaga `cumulative_min_pct` liczonego przez `window_state()` i wprost zakazuje przepisywania z pamięci, a przy sesji 0 nie ma z czego go policzyć. Trzecia niezgodność w tym samym kroku: KROK 5 każe ustawić `decision_gate: weekly-<niedziela>`, co **Lesson #18 i `_check_decision_gate_units` wprost zakazują**. Dziś rozstrzygnąłem na korzyść skryptu (okno INTU otwiera post-close 8/26), bo to on jest egzekwowany maszynowo — ale rozjazd zostaje w tekście SKILL i wróci przy następnym druku AMC. Rozstrzygnięcie: przepisać KROK 5 pod `post_event.py` (sesja 1 = pierwsze rozliczone zamknięcie po druku, gate w sesjach) albo zmienić skrypt — nie zostawiać obu wersji.
102
❌ CPRT — BUY wycofany 7/12; re-entry tylko na potwierdzoną akumulację ✅ done · due weekly-2026-08-16 — Weekly 8/2: score **2/6** bez zmian, RSI nie oversold. ⚠️ **Zastrzeżenie tego runu: dataroma był NIEDOSTĘPNY** (ConnectTimeout + HTTP 406), więc noga (b) — 13F net-ADD — nie mogła być sprawdzona i poleciała fail-closed jak u wszystkich 51 kandydatów. To NIE jest potwierdzenie braku akumulacji, tylko brak danych (Lesson #5: „data unavailable ≠ confirmed absence"). Re-entry nadal wymaga: (a) pierwszy insider Form 4 BUY, LUB (b) 13F Q2 **8/14** net-ADD. Sama tania wycena + RSI<40 NIE wystarczą — to była dokładnie lekcja 7/12.
116
🔧 Audyt: które reguły żyją TYLKO w prozie (bez guardu)? ⏳ in progress · due monthly-2026-09-01 — Do monthly 9/1: przejść `portfolio.md § Framework hardening` #1-#16 i wypisać, które reguły nadal nie mają guardu. Priorytet: akcje nieodwracalne. **Nowy przypadek dopisany przez weekly 8/2 — patrz #144 (test stabilizacji rudy przechodzi na cichym zjeździe).**
117
🔄 Weekly 8/2 framework calibration — recurring od #105 ✅ done · due weekly-2026-08-02 — Pięć punktów kalibracji wykonanych na rozliczonych zamknięciach 7/31.
118
🔄 Weekly 8/2 cash override re-decision — recurring od #106 ✅ done · due weekly-2026-08-02 — Re-decyzja cash override; warunek composite rozstrzygnięty printem NAAIM 7/29.
119
🔧 SKILL.md — dopisać krok 5.0 (dataroma cache) — wymaga edycji przez Dawida ⏳ in progress · due weekly-2026-08-30 — Do dopisania w KROK 5: »python3 scripts/dataroma_cache.py --verified« PRZED pierwszą partią scoringu. ⚠️ **Weekly 8/2 dodaje warunek, którego pierwotny zapis nie miał, bo dopiero dziś się ujawnił: sam krok NIE WYSTARCZY.** Odpaliłem go zgodnie z opisem — i skończył się ciszą, bo `dataroma.com` był niedostępny (health check: ConnectTimeout 15 s; ponowienie: HTTP 406). Cache `dataroma_cache_2026-08-02.json`: **10 wpisów, 2 z danymi**, wobec **58/58** przy runie 7/26. Skutek: **Crit 4 poleciał fail-closed dla wszystkich 51 kandydatów** — `super_investor_new` nie jest spełnione u ani jednego tickera, więc dzisiejsze wyniki to **wartości dolne, zaniżone o max 1 pkt**. Zapis powinien brzmieć: odpal cache, **sprawdź, czy log pokazuje ≥40 tickerów**, a jeśli nie — **zaraportuj degradację Crit 4 w raporcie zamiast milcząco scorować**. Bez tej drugiej połowy krok daje złudzenie kontroli. Edycja: Settings > Capabilities albo repo źródłowe.
120
🚨 NAAIM ZA PAYWALLEM — POTWIERDZONE 8/1; decyzja o composite ✅ done · due weekly-2026-08-09 — **Ryzyko z 7/26 zmaterializowało się — to już nie jest zapowiedź.** `naaim.org/programs/naaim-exposure-index/` odpowiada **200 OK** z `dateModified 2026-07-31T17:01:35-04:00`, ale **tabela `surveydata` została USUNIĘTA z HTML**: został sam selektor CSS `table#surveydata` bez ani jednego wiersza, **link XLSX since-inception skasowany**, w treści pojawiają się „subscription"/„subscribe"/„login". **Print 7/29 (79,70) był ostatnim darmowym** i został pozyskany objazdem — WebSearch z dwóch niezależnych agregatorów (CEIC + ycharts), spójny z prior 84,02. **To zadziałało raz i nie jest metodą.** NAAIM to jedna z dwóch nóg composite'u #4, który steruje tym, czy w ogóle wolno kupować — a właśnie w tym runie **odpalił pierwszy raz od 6/14**, czyli jego waga decyzyjna jest maksymalna dokładnie wtedy, gdy źródło znika. Trzy opcje: (a) subskrypcja, (b) proxy instytucjonalny (CFTC COT, Investors Intelligence, put/call), (c) przedefiniowanie composite'u na jedną nogę + inny warunek potwierdzający. Backfill zabezpieczony: `data/naaim_exposure_history.csv` = 1 046 tygodni / 20,1 roku. 🚨 **Higiena per #124: to jest sprawa OSOBNA od pytania, czy próg <80 nadal znaczy to, co miał znaczyć.** Nie scalać w „skoro zmieniamy wskaźnik, to poluzujmy próg" — to framework bypass klasy Rule #4.
127
✅ Bufor operacyjny 2% NAV — ODBUDOWANY 8/3 wpływem z TRIM HIG; zero T-billi sprzedanych ✅ done · due weekly-2026-08-09 — ✅ **ZAMKNIĘTE 2026-08-03.** `cash_buffer.py` po zaksięgowaniu trimu HIG: wolna gotówka **$192,38 = 2,343% NAV**, próg 2,0% = **$164,23**, **zapas +$28,15**, `state: ok`, `proposal: null`. Źródło: wpływ netto **$146,82** ze sprzedaży HIG (raport XTB 8/3), **NIE** sprzedaż T-billi — pozycja IB01.L nadal 30,6959 sh. Luka ciągnęła się **sześć runów** (7/30 · 7/31 · 8/2 · 8/3 pre · 8/3 open · rozliczenie 8/3). **Kolejność HIG → IB01, rekomendowana w każdym z ostatnich pięciu raportów, zadziałała** — i zaoszczędziła ~$4/rok yieldu. Rec `🚦 TRIM IB01.L` zamknięta jako `superseded`. — PRIOR (weekly 8/2): wolna gotówka **$45,56 = 0,556% NAV**, próg 2,0% = **$164,20**, luka **$118,64**, transza **1 sh IB01.L ≈ $121,34** → po fillu $166,90 = 2,033% ✓. **Trzeci run z rzędu z identyczną luką (7/30 · 7/31 · 8/2)** — rec `🚦 TRIM IB01.L` istnieje i stoi od 7/31, więc wąskim gardłem nie jest już framework, tylko wykonanie. 💡 **Nowa okoliczność z tego runu, zmieniająca kolejność:** wystawiona dziś rec **TRIM HIG (~$149)** domyka lukę **samodzielnie**. Jej `valid_until` wprost to przewiduje („ALBO do momentu, gdy wolna gotówka wróci >=2% NAV inną drogą"). **Kolejność: HIG najpierw; IB01 tylko jeśli HIG nie zostanie wykonany.** Wykonanie HIG załatwia dwie rzeczy naraz — redukcję pozycji, w której cztery testy wskazują ten sam kierunek, i bufor — bez sprzedaży T-billi.
128
⛔ Cash override wygaszony — cztery sleeve''y pod targetem, ale Rule ✅ done · due weekly-2026-08-02 — Rozstrzygnięcie tempa deployu na weekly 8/2 (obowiązek nałożony przy wygaszeniu 7/30).
130
⚠️ MSFT nadwaga 6,5% — warunek odwrotu na marży (capex FY27 $255-260 mld) · due 2026-10-31 — Bez zmian proceduralnych. ⚠️ Kontekst z tego tygodnia **wzmacnia** ten warunek: MSFT zrobił **+19,43% WTD** (Azure +43%, RPO $678 mld +84%) i zamknął **na szczycie 52W**, percentyl 5Y **87,2%**. Nadwaga jest dziś kupowana po cenie, przy której Rule #4 nie pozwoliłby wejść — a przegląd 5-letni z 8/1 pokazał **FCF spadający trzy lata z rzędu** (74,07→71,61→66,99 mld) przy przychodzie +35%. Warunek odwrotu pozostaje na marży, nie na cenie.
132
🔄 Factor attribution refresh — recurring monthly (F-F publish) · due monthly-2026-09-01 — Next gdy Ken French opublikuje 2026-06 (na 8/1 seria kończy się na 2026-05). RMW −21,16 = quality headwind 12 m z rzędu, bez mean-reversion; rękaw Core/Quality 28,77% NAV jest przechylony dokładnie w ten faktor.
133
🔄 Discovery scan triangulation — recurring monthly (reguła kompletności źródeł) · due monthly-2026-09-01 — Bez zmian; monthly 9/1.
134
🔧 finviz_helper.screen_quality_value() — regresja upstream: zdublowana kolumna ⏳ in progress · due monthly-2026-09-01 — Bez zmian; weekly 8/9.
135
🚨 Liczniki surowcowe — kadencja 22:30 CEST wykluczona, ale problem ma DRUGĄ warstwę (czwarty raz) ⏳ in progress · due monthly-2026-09-01 — Decyzja o źródle liczników surowcowych — z nowym ustaleniem z weekly 8/2.
136
🚨 MELI Q2 + UBER Q2 (8/5) — podwójna brama pozycji, 9,71% NAV rozstrzyga się w jeden wieczór ✅ done · due 2026-08-05 — **T−3.** MELI (5,94% NAV) i UBER (4,85%) raportują tego samego dnia. **MELI:** `exit_discipline_v2` trzyma `gate_a` na **`warn` — marża operacyjna ex-jednorazowe 9,6% vs próg 10** = **licznik TRIM 1/2**; drugi taki odczyt w Q2 **odpala propozycję TRIM**. Przychód +30,4% ✓. WTD +3,20%. **UBER:** rozstrzygnąć wzorzec EPS — dwa kwartały z rzędu ok. **−82% surprise** to wzorzec, nie one-off; przy Waymo-risk to realny kandydat do TRIM, **nie do ADD**, mimo że `gate_a`/`gate_b` są `ok` (marża 14,6%, przychód +14,5%). Score 3/6 w tym runie (spadek z 5/6 — ale patrz zastrzeżenie #119: Crit 4 poleciał fail-closed dla całej puli). Wymagane wyjście: **jawny werdykt ADD/HOLD/TRIM per obie nazwy w post-close 8/5**, nie odłożenie na weekly 8/9.
137
🚨 13F Q2 (8/14) — brama w kolejce: INTU T3 · VALE T2 · CPRT re-entry (🧹 DECK USUNIĘTY 8/13 — ścieżka ZUŻYTA przy fillu T1 8/10) ✅ done · due weekly-2026-08-16 — **TRZY aktywne bramy zależą od jednego zdarzenia** (było: cztery). INTU T3 (noga b), VALE T2 (noga a, half-size), CPRT re-entry (noga b). 🧹 **DECK USUNIĘTY z tej listy 2026-08-13 (polecenie Dawida):** ścieżka (c) była trzecią z trzech ALTERNATYWNYCH dróg do transzy T1, a T1 został WYKONANY 8/10 — fill zużywa wszystkie trzy (active-trigger guard, Lesson #5). Trzymanie jej tu jako żywej bramy kazałoby przy net-ADD **kupić już wykonaną transzę drugi raz**, a DECK wchodził w tę bramę z JEDYNYM dodatnim stanem z czterech (netto +2) = najbardziej prawdopodobne odpalenie. Dla DECK 13F Q2 to wyłącznie `confirming_signal` -> upgrade konwikcji do MEDIUM_HIGH; jedyna brama transzowa to Q2 FY27 ~10/22. ⚠️ **Ten wpis był TRZECIM miejscem z tym samym stale zapisem** (obok `catalysts.md` i `entry_plan.next_tranche_gate`) i został znaleziony dopiero przy oglądaniu dashboardu — guard `validate_consumed_paths_in_catalysts` rozszerzony tego samego dnia o skan `dashboard_state.yaml`. ⚠️ **Waga tej daty wzrosła w tym runie:** `dataroma.com` był **niedostępny** (ConnectTimeout + 406), więc Crit 4 nie działał dla nikogo; 8/14 jest jednocześnie **momentem odświeżenia danych i momentem rozstrzygnięcia czterech bram**. Jeśli dataroma nie wróci do 8/14, to nie jest opóźnienie jednej metryki, tylko **cztery zablokowane decyzje** — do sprawdzenia przy weekly 8/9, czy potrzebny jest plan awaryjny (SEC EDGAR 13F bezpośrednio przez `market.boruta.tech`, który w health check świeci 200 OK).
138
📏 Size cap — potwierdzić 9 soft-dropów, po nich nadal 33 wobec limitu · due monthly-2026-09-01 — Bez zmian; monthly 9/1.
139
⚖️ MSFT — forma celu 6,5%: rekomendacja weekly to wariant (b), próg jako PERCENTYL nie kwota ✅ done · due weekly-2026-08-02 — Rozstrzygnięcie formy celu wagi po wygaśnięciu rec ADD 8/1.
140
🟢 DECK — jedyny kandydat przechodzący Rule ✅ done · due weekly-2026-08-09 — **Ścieżka (a) jest bliżej niż wskazywał zapis z 8/1.** Na rozliczonych zamknięciach 7/31: pasmo trzech ostatnich (103,54 / 99,69 / 96,88) = **6,66%** vs próg ≤3,5% → fail o **3,16pp**; **RSI 40,12 <42 ✓**; dołek $96,04 nietknięty ✓ = **dwie nogi z trzech spełnione**. Wystarczą **trzy sesje o zbliżonych zamknięciach**, żeby pasmo się domknęło — dlatego eval jest DZIENNY, nie tygodniowy. Ścieżka (b): cena wymaga −5,04%, RSI −5,12 pkt = fail na obu. Ścieżka (c): 13F **8/14 = T−12**. **Kontekst, który podnosi wagę tej pozycji w kolejce:** composite odpalił, okno jest otwarte, a DECK to **jedyny z 51 kandydatów, który przechodzi Rule #4** (percentyl 48,5% = `mid`, P/E 13,78 / fPE 11,58 vs 10Y mean ~23,6). Czyli okno się otworzyło i **jedyny kwalifikujący się kandydat nadal nie ma wejścia** — to NIE jest powód do rozluźnienia progu pasma.
141
🆕 TTD — najgłębsza wycena w puli (0,6 percentyla), ale trzy rzeczy się nie zgadzają; Q2 8/6 to brama TEZY ✅ done · due weekly-2026-08-09 — **Weekly 8/2 przyjrzało się TTD po raz pierwszy od dodania i zapisuje, dlaczego to NIE jest dziś propozycja.** Za: **percentyl obserwacji 5Y = 0,6% = `bottom_decile`** (najniższy w całej puli 51), **−79,9% od szczytu 52W**, fwd P/E **15,12**, D/E **0,17**, ROE 16,74%, marża operacyjna 20,26%, przychód **+11,82% Q/Q**, target $25,31 = **+40%**. Przeciw, i to rozstrzyga: (1) **RSI 44,97 = NIE oversold** — cena nie kapituluje, tylko dryfuje; (2) **pasmo 3 zamknięć 5,68%** = brak stabilizacji; (3) **insiderzy WYŁĄCZNIE sprzedają** — ostatnie cztery transakcje to Sale/Proposed Sale (28 maja, 11 maja, 5 marca ×2), **zero zakupów**; (4) **EPS Q/Q −16,77%** przy rosnącym przychodzie = kompresja marży. **Aktywna narracja o dysrupcji** (AI + retail media vs niezależny DSP) bez dowodu adaptacji → cap **MEDIUM** nawet gdy brama się otworzy. **Q2 8/6 jest bramą TEZY, nie ceny:** przy −80% od szczytu pytanie nie brzmi „czy tanio", tylko „czy model nadal działa". Warunek promocji bez zmian: brak cięcia guidance + post-event pullback (pasmo ≤4%, cena ≤ pre-event) + **czwarty zakup insidera LUB pierwszy właściciel 13F**.
142
✅ HIG — TRIM WYKONANY 8/3 (cel 5,0% → 4,0% osiągnięty; waga po fillu 3,99%) ✅ done · due weekly-2026-08-09 — ✅ **WYKONANE 2026-08-03.** Netto **−1,0231 sh za $146,82** (sprzedaż brutto 2,0769 sh @ avg $142,3805 + odkup korekcyjny 1,0538 sh @ avg $141,2887 po zdublowanym zleceniu XTB), prowizja $0, zysk zrealizowany **+$33,07**. Pozycja **3,3323 → 2,3092 sh**, waga **5,78% → 3,99%** vs cel **4,0%** = trafione z dokładnością **0,01pp**. Rękaw Income/Defensive **3,99%**, czyli zgodnie z zamiarem pod celem 6,5-13,0%. ⚠️ Incydent wykonawczy (zlecenie odpaliło z dwóch sesji brokera jednocześnie) opisany w `journal.md` 8/3 jako **lekcja #37**; round-trip dał **+$1,15**, ale to funkcja kierunku ceny, nie procesu. — PRIOR: Propozycja zgłoszona przez monthly 8/1 → **rec wystawiona przez weekly 8/2** po ponownej weryfikacji wszystkich czterech testów na danych z 7/31, z których **żaden nie zmienił się na korzyść**: (1) **fwd P/E 10,33 > trailing 9,17** = konsensus czeka SPADKU EPS (EPS5Y **2,92%**, PEG **3,54**); (2) **percentyl 5Y 99,0% = `top_decile` 🔒**, cena **−2,84% od szczytu 52W** — Rule #4 nie pozwoliłby dziś WEJŚĆ; (3) **Insider Trans −25,33% = najgorszy w książce**, ostatnie transakcje to Option Exercise + Sale tego samego dnia, zero zakupów na otwartym rynku; (4) **Recom 2,29**, target **+5,74% = najniższy upside w portfelu**. **NIE EXIT** — beta 0,46, funkcja defensywna potwierdzona w praktyce (6/05: +3,78% przy SPY −2,58%), Q2 7/23 był beatem +8,93%. Po trimie rękaw Income/Defensive **4,05% = zostaje POD celem 6,5-13,0%**, więc kapitał ma dokąd wrócić. 💡 **Wpływ ~$149 domyka lukę bufora operacyjnego ($118,64) samodzielnie → wykonać PRZED trimem IB01.L** (patrz #127).
143
🔄 Weekly 8/9 framework calibration — recurring od #117 ✅ done · due weekly-2026-08-09 — Weekly 8/9, pięć punktów, każdy z liczbą i porównaniem do dziś: (1) **Composite #4 — czy trzyma drugi tydzień?** Dziś 2/2 (AAII 31,0 / NAAIM 79,70). ⚠️ **Noga NAAIM może nie mieć źródła** — jeśli #120 nie zostanie rozstrzygnięte, zapisz to jako brak danych, **nie** jako przetrwanie warunku (Lesson #5). (2) **Cycle drift:** miedź dziś **99,0 percentyla** (rekord cyklu) · WTI **75,2** · złoto/srebro **87,4** — czy któryś schodzi poniżej 75 (= zdjęcie restricted)? (3) **Crowded-count** dziś **2/5** (SPX blisko ATH + VIX 15,99 complacent); VIX >25 = reguła #3. (4) **Alpha WTD** dziś **+1,28pp** — ile z niej to MSFT (dziś: praktycznie całość, +19,43%)? Policz alphę **bez MSFT**, żeby zobaczyć, czy książka pracuje, czy wiezie ją jedna nazwa. (5) **Czy „nie ma czego" nadal obowiązuje** — czy któryś z 51 kandydatów przeszedł z `off_high` do realnego cofnięcia. Dziś zero.
144
🚨 Test stabilizacji rudy przechodzi na CICHYM ZJEŹDZIE — wada bramy VALE T2 (c) ✅ done · due weekly-2026-08-16 — **Znalezione przy re-ewaluacji VALE w tym runie i warte osobnego wpisu, bo to wada konstrukcyjna, nie odczyt.** Brama (c) „stabilizacja rudy" ma trzy nogi: pasmo 10 sesji ≤1,5%, max |zmiana d/d| ≤1,0%, odległość od dna 6M ≤+3%. Na `TIO=F` **$98,00** wszystkie trzy są **spełnione** (pasmo 0,71% · max d/d ~0,25% · odległość od dna 0%). **Problem: dno 6M to DZISIEJSZE zamknięcie.** Ruda robi **nowe minimum** w tym samym odczycie, w którym „się stabilizuje", a RSI(14) = **26,39** = głęboko wyprzedana. **Ciasne pasmo wokół poziomu, który powoli się osuwa, spełnia test zbudowany na paśmie i odległości od dna — bo dno idzie razem z ceną.** Test mierzy brak zmienności, a miał mierzyć koniec spadku. **Naprawa: dopisać czwartą nogę — „dno 6M nie zostało pogłębione w oknie 10 sesji".** Do implementacji razem z guardem z #116. ⚠️ Praktycznie dziś bez skutku: VALE T2 i tak jest gated na 13F 8/14 half-size, a **miedź na 99,0 percentyla** jest niezależnym i mocniejszym argumentem przeciw dokupowaniu metali przemysłowych teraz.
145
🔄 Weekly 8/9 cash re-decision — recurring od #118 (pierwsza po wygaśnięciu override) ✅ done · due weekly-2026-08-09 — **Pierwsza re-decyzja po tym, jak override przestał istnieć — zmienia się pytanie.** Do 8/2 brzmiało „czy przedłużyć override". Od teraz brzmi: **„czy Cash/Yield zbliża się do efektywnego sufitu 32,5%, a jeśli nie — dlaczego"**. Stan dziś: **46,07% = +13,6pp nad sufitem**, cztery rękawy pod celem (Tactical −2,15pp · Income/Defensive −0,67pp · Energy −0,94pp · Industrial −0,56pp). **Wymagane wyjście weekly 8/9:** (a) czy composite nadal odpala (patrz #143 pkt 1), (b) czy którykolwiek kandydat przeszedł Rule #4 — dziś **zero z 51**, (c) jeśli nadal zero, **zapisz to jawnie jako ograniczenie sygnałowe, nie polityczne**, i nie proponuj fillu tylko po to, żeby ruszyć wskaźnik. Zmniejszenie Cash/Yield przez **TRIM HIG** (jeśli wykonany) liczy się do bufora, **nie** do deployu — to zamiana jednej pozycji na gotówkę, nie wejście w ryzyko.
146
⚠️ SW — czwarty mis NIE nastąpił; rozjazd „score vs fundamenty" rozwiązał się w drugą stronę ✅ done · due weekly-2026-08-02 — Zamknięcie wątku z #123 (weekly 7/26).
147
🚦 ZATWIERDZONE przez Dawida 2026-08-06 — bufor operacyjny 2.0% → 5.0% NAV ✅ done · due post-close-2026-08-06 — Decyzja Dawida 2026-08-06 ~16:45 CEST w odpowiedzi na pytanie „minelo kilka miesiecy a nadal mamy 50% budzetu w gotowce". **Zmiana: `cash_policy_override.operating_buffer_pct_nav` 2.0 → 5.0** w `portfolio.md` → `## Cash state`. Uzasadnienie: przy 47,6% NAV w gotowce i T-billach rekomendacje DECK ($164), INTU T3 ($120) i VALE T2 byly blokowane **piec sesji z rzedu** brakiem rozliczonego USD — wolna gotowka $233 przy buforze $166 daje nadwyzke $67, ponizej pojedynczej transzy. Bufor 5% = ~$416 pokrywa kazda pojedyncza transze bez czekania na rozliczenie T+. Koszt: jednorazowy trim IB01.L ~$250, utracony yield ~$9/rok. **IMPLEMENTACJA NALEZY DO POST-CLOSE 2026-08-06** (wlasciciel wystawiania TRIM IB01.L per doktryna `portfolio.md` → `\U0001F6A6 Bufor operacyjny`). ⚠️ **Wykonac ATOMOWO — zmiana progu BEZ jednoczesnego wystawienia rec zablokuje build**: `cash_buffer.py` zwroci `state: breach`, a `validate_yaml.py` → `validate_cash_buffer()` podniesie ERROR i przerwie `build_dashboard.py`. Kolejnosc: (1) zapis progu 5.0 w `portfolio.md`, (2) rec `TRIM IB01.L` ~2 sh na pokrycie luki, (3) validator, (4) build.
148
🚨 Rule #4 stosowany SZERZEJ niz doktryna — cycle_position.py nie zna rekawow ✅ done · due weekly-2026-08-09 — Znalezione 2026-08-06 przy analizie „dlaczego 47,6% NAV siedzi w gotowce". **`scripts/cycle_position.py` liczy `rule4_restricted` WYLACZNIE z bracketu percentyla** (`RESTRICTED_BRACKETS = {top_decile, high}`, linia 82/124) — **zero swiadomosci rekawa czy klasy aktywow**. Tymczasem doktryna w `portfolio.md` (od 2026-04-30, sekcja „Cycle-position check — strict implementation dla cyclical assets") mowi wprost: hard cap **aplikuje sie do BUY proposals w sleeves Energy / Industrial metals / Precious metals / Uranium / Country ETF on cyclical economy**, a **„Quality compounders + structural-thesis assets uzywaja override path (4-test), nie cycle-position hard cap"**. Skutek: nazwy z rekawow NIEcyklicznych sa oznaczane `\U0001F512 restricted` i tak czytane w raportach — **dzis GOOG 97,1% (Core/Quality), MSFT 90,9% (Core/Quality), HIG 99,8% (Income/Defensive)**. Faktycznie cykliczne i slusznie restricted sa tylko IUES.L (Energy), 4GLD.DE + ISLN.UK (Precious). Czyli **„7 z 13 pozycji restricted" powtarzane w raportach od tygodni jest zawyzone — realnie 3 z 13 podlegaja hard capowi**, reszta powinna isc sciezka 4-test override (uzywana i udokumentowana przy META 5/11, MELI 5/18, 4GLD 5/28, MSFT 6/15). ⚠️ **To jest trzecie wystapienie tej samej klasy defektu w jednym dniu** (licznik `gate_a_consecutive` niezapisywany; `execution_state` nieczytane): **narzedzie i doktryna daja rozne odpowiedzi, a odpowiedz narzedzia zostala skopiowana do raportow jako fakt.** Do rozstrzygniecia: (a) czy `cycle_position.py` dostaje mapowanie ticker→sleeve i flaguje restricted TYLKO dla rekawow cyklicznych, (b) czy skan tygodniowy 51 kandydatow ma byc powtorzony pod poprawionym zakresem — uwaga, WM i tak odpada na Crit 7 (P/E TTM 59,46 vs 10Y mean ~28,8-32,1), wiec naprawa NIE odblokuje automatycznie kandydatow, ktorych odrzucono z innych powodow.
149
❓ Czy szerokie ETF-y krajowe (EWS, EWJV) naleza do zakresu cyklicznego Rule #4? ✅ done · due weekly-2026-08-09 — Otwarte pytanie ujawnione 2026-08-06 przez zawezenie zakresu Rule #4 (action #148). Doktryna wymienia jako cykliczne m.in. **„Country ETF on cyclical economy"** — ale nie definiuje, ktore gospodarki sa cykliczne. Klasyfikacja przez rekaw zalatwia przypadki oczywiste: **ENOR** ma rekaw `Energy` (Norwegia = gospodarka naftowa) i **KTY.WA** `Industrial metals` → oba slusznie `restricted`. Nierozstrzygniete zostaja **EWS (Singapur, rekaw `Income / Defensive`)** i **EWJV (Japonia value, rekaw `International`)** — po zmianie oba przechodza z `restricted` na `override_required`. To NIE jest przypadek marginalny: **oba maja score 4/6 = najwyzszy w calym skanie 51 kandydatow, oba siedza na percentylu 99,6%**, czyli sa jednoczesnie najlepiej punktowane i najwyzej w swoim zakresie 5Y. Innymi slowy zmiana zakresu odblokowala dokladnie te dwie nazwy, ktore najbardziej wygladaja na „kupno na szczycie". **Zapisuje to jawnie, zeby nie przeszlo bokiem.** Do rozstrzygniecia w weekly 8/9: (a) czy szeroki ETF na gospodarke rozwinieta liczy sie jako `cyclical` (wtedy dopisac do `CYCLICAL_SLEEVES` mechanizm per-ticker), czy (b) zostaje `structural` — ale wtedy 4-test override dla ETF-u koszykowego wymaga jawnej obrony tezy strukturalnej, bo „Japonia value" i „Singapur" to alokacja, nie teza o firmie. Do czasu rozstrzygniecia **zadnego BUY na EWS/EWJV nie wystawiam**.
150
⛔ dashboard_data.cycle_position() liczy miare zdeprecjonowana mimo nazwy `percentile_rank` ✅ done · due weekly-2026-08-16 — Znalezione 2026-08-06 przy pracy nad action #148. `scripts/dashboard_data.py` ma **wlasna, druga implementacje** `cycle_position()`, ktora liczy `(cena − min) / (max − min)` = **pozycje w zakresie**, czyli miare zdeprecjonowana audytem 2026-07-30 (rozjazd do **+46pp na srebrze**, **+32pp na WTI**) — a pole nazywa sie `percentile_rank`, i naglowek modulu reklamuje ja jako „Rule #4 5Y percentile rank". **Dzis nic nie liczy zle w produkcji**: funkcja jest wolana wylacznie z wlasnego bloku `__main__` (linia ~1563); `build_dashboard.py` i `score_all_verified.py` importuja `dashboard_data`, ale tej funkcji nie uzywaja. Ryzyko jest przyszle i ciche — kazdy kolejny import dostalby zdeprecjonowana miare pod poprawnie brzmiaca nazwa. Dzialanie 2026-08-06: **dodany glosny deprecation banner w docstringu** (nie usuwam, zeby nie zrywac API bez przesledzenia wywolan). Do weekly 8/9: usunac albo przepiac na `cycle_position.cycle_position()`.
151
🚨 Skan 8/2 liczyl `super_investor_new` z NIEDZIALAJACEGO dataroma — przeliczyc 51 kandydatow ✅ done · due weekly-2026-08-09 — Znalezione 2026-08-06 przy przeliczaniu skanu pod poprawionym zakresem Rule #4. Weekly 8/2 zapisalo wprost: „dataroma byl NIEDOSTEPNY (ConnectTimeout + HTTP 406), wiec noga (b) — 13F net-ADD — nie mogla byc sprawdzona i **polecila fail-closed jak u wszystkich 51 kandydatow**" — a jednoczesnie w podsumowaniu: „flaga `super_investor_new` nie jest spelniona u **ani jednego** tickera". **Dzis `dataroma_cache.refresh()` pobral 21 z 21 tickerow bez bledu.** Czyli zdanie o zerowej akumulacji instytucjonalnej opisywalo **awarie zrodla, nie rynek**. Poniewaz `super_investor_new` jest jedna z szesciu flag score i jednoczesnie **test 4 z 4-test override**, caly skan 8/2 byl liczony z ta noga wyzerowana technicznie. **Do zrobienia: przeliczyc flage dla wszystkich 51 na swiezym cache i zaktualizowac `score` + `entry_signals` w `watchlist.md`.** To jedyny punkt z listy weekly, ktory realnie moze zmienic score do progu STRONG 4/6 i wyprodukowac kandydata. ⚠️ Wlascicielem scoringu jest weekly — open snapshot swiadomie NIE przelicza score, tylko zglasza. Material: `reports/2026-08-06_rule4-rescan_prep-for-weekly.md` sekcja 3a.
152
⚖️ Kanoniczne zrodlo P/E + czy Crit 7 liczy TTM czy forward (rozjazd WM 31,74 vs 59,18) ✅ done · due weekly-2026-08-09 — WM ma 2026-08-06 **P/E TTM 31,74 wg finviz** i **59,18 wg yfinance** — rozjazd **86%** na tym samym wskazniku tego samego dnia; forward zgadza sie co do grosza (24,69 vs 24,54). Prawdopodobna przyczyna: GAAP vs skorygowany EPS (integracja Stericycle w TTM). **Dlaczego to wazne: weekly 8/2 odrzucilo WM — najwyzej punktowanego kandydata calego skanu (4/6) — zdaniem „P/E TTM 59,46 vs 10Y mean ~28,8-32,1 (Crit 7 odrzuca)". Na odczycie finviz LUB na forward Crit 7 by NIE odrzucil.** Werdykt dla WM i tak pozostaje „nie kwalifikuje sie" (odpada na tescie 4: dataroma 3 wlascicieli, netto −1, zero zakupow insidera 6m), wiec **wynik sie nie zmienia — ale proces jest wadliwy niezaleznie od tego**: gdyby test 4 przeszedl, decyzja zalezalaby od tego, ktore zrodlo ktos tego dnia odpytal. Do ustalenia: (a) kanoniczne zrodlo P/E, (b) czy Crit 7 (wycena ponizej 10Y mean) liczy sie na TTM czy forward, (c) jak traktowac spolki z jednorazowymi obciazeniami w TTM. Material: `reports/2026-08-06_rule4-rescan_prep-for-weekly.md` sekcja 3b.
153
🔧 HIG `target_weight_pct: 5` w pliku vs cel 4,0% z wykonanej rec TRIM HIG ✅ done · due weekly-2026-08-09 — `portfolio.md` ma dla HIG **`target_weight_pct: 5`**, a wykonana rec `TRIM HIG` (weekly 8/2, fill 2026-08-03) mowi „cel wagi 5,0% → 4,0% osiagniety, waga po fillu 3,99%". Skutek: pozycja przy **3,98% NAV** wyglada w kazdym liczeniu na **niedowazona o 1,02pp ≈ $85**, podczas gdy faktycznie **siedzi na swoim nowym celu**. ⚠️ Ten blad **wszedl juz do analizy** — open snapshot 2026-08-06 liczyl HIG jako $85 luki przy szacowaniu tempa deployu (odpowiedz na pytanie Dawida o 47,6% gotowki). Korekta: tej luki nie ma. **Do zrobienia: zapisac `target_weight_pct: 4` w `portfolio.md`** (wlasciciel pliku: post-close/weekly — open snapshot nie jest wlascicielem). Ta sama klasa defektu co #148/#150: decyzja zapadla, plik jej nie odzwierciedla.
154
❓ 4-test nie ma czwartej nogi dla ETP — dataroma sledzi tylko pojedyncze spolki ✅ done · due weekly-2026-08-09 — Luka metodyczna ujawniona 2026-08-06. Test 4 z 4-test override („super-investor / institutional adoption") jest wypelniany z dataroma, ktora sledzi **pozycje 13F w pojedynczych spolkach**. Dla ETF-ow zwraca **0 wlascicieli** — dzis: EWS 0, EWJV 0, CIBR.UK 0, SMH 1, RHM.DE 0, BATS.L 0, ISP.MI 0, VIE.PA 0. Jednoczesnie doktryna `portfolio.md` **klasyfikuje ETF-y tematyczne jako override eligible** (wiersz „Cybersecurity (Tactical structural): PANW, HACK, **CIBR**" oraz „AI semis: TSM, **SMH**"). Czyli doktryna dopuszcza sciezke, ktorej czwartej nogi **nie da sie wypelnic z obecnych zrodel** — a per Lesson #5 „data unavailable ≠ confirmed absence", wiec nie wolno tego czytac ani jako pass, ani jako fail. Do rozstrzygniecia: (a) test 4 dostaje wariant dla ETP (np. przeplywy do funduszu / AUM trend / adopcja instytucjonalna underlyingu), albo (b) ETP-y tematyczne wracaja pod strict counter-cycle. Material: `reports/2026-08-06_rule4-rescan_prep-for-weekly.md` sekcje 2 (CIBR.UK) i 6 pkt 4.
155
⚖️ TSM — czy dataroma netto −11 przy 24 wlascicielach dyskwalifikuje test 4? ✅ done · due weekly-2026-08-09 — Decyzja jakosciowa do podjecia, nie defekt. TSM jest **jedyna nazwa w calym przegladzie, gdzie trzy testy override przechodza wyraznie**: (1) named driver — AI capex w semis, uzywany w doktrynie jako **przyklad wzorcowy** testu 1; (2) multi-year evidence — rekordowy capex hyperscalerow 2023-2026; (3) valuation — **fPE 19,49, PEG 0,52, EPS5Y 37,45%, ROE 40,06%, D/E 0,15** = najlepsza wycena w grupie. Rozstrzyga **test 4**: dataroma **24 wlascicieli, netto −11** (4 dodania / **16 redukcji**). Pytanie: czy szeroka baza wlascicieli przy silnej redukcji netto to **adopcja instytucjonalna z rotacja** (test przechodzi), czy **instytucje wychodza** (test nie przechodzi)? Doktryna mowi tylko „nie tylko retail momentum" i nie rozstrzyga kierunku przeplywu. Kontekst: cena $422,17, RSI 52,92, **−11,86% od 52W high**, percentyl 96,7% = `top_decile` (rekaw Tactical/Themes → `override_required`, nie hard cap). Poprzednia rec wygasla 7/21 jako `chase_dead`. ⚠️ Zweryfikowac przy okazji `insider6mo: 153` w cache — wyglada na artefakt parsera (reszta zestawu ma 0-2).
157
🔧 Konwencja RSI(14) — N=60 NIE reprodukuje finviz; przyjac pelna serie jako kanoniczna ✅ done · due weekly-2026-08-09 — Rozstrzygniete de facto przez post-close 2026-08-07, wymaga ZATWIERDZENIA i zapisu do schematu. Test na czterech tickerach na zamknieciach 8/7: DECK pelna seria 41.773 / N=60 42.501 / **finviz 41.77** · MELI 49.81 / 50.50 / **49.81** · UBER 58.07 / 58.01 / **58.07** · TTD 28.42 / 28.67 / **28.42**. **Pelna seria reprodukuje deklarowane zrodlo co do drugiego miejsca na WSZYSTKICH czterech; N=60 rozjezdza sie na wszystkich, na DECK o 0.73 pkt.** To nie byla »niepewnosc pomiaru« (tak nazywaly to runy 8/6 i 8/7 rano), tylko **blad konwencji**. ⚠️ **Ekspozycja decyzyjna byla realna:** pod N=60 DECK dalby 42.50 i sciezka (a) rec `BUY DECK` **NIE odpalilaby**; pod pelna seria daje 41.77 i odpala. Do zrobienia: (1) zapis konwencji w `dashboard/schemas/watchlist.schema.yaml` przy polu `rsi_estimate`, (2) usuniecie odwolan do »60 rozliczonych zamkniec« z blokow `post_event_tracking`, (3) decyzja, czy stare odczyty N=60 wymagaja przeliczenia.
158
⚖️ Brama wyjscia vs target sleeve u — IUES.L po trimie 2.94% NAV wobec pasma Energy 5.0-7.5% ✅ done · due weekly-2026-08-23 — Ujawnione przez post-close 2026-08-07 przy drugiej eskalacji `gate_a` IUES.L (WTI 2/2 pod $80). Pozycja wazy **3.44% NAV**, czyli **JUZ ponizej** dolnej krawedzi pasma docelowego sleeve u Energy (5.0-7.5%); po zatwierdzeniu proposalu TRIM 0.5pp zejdzie do **~2.94%**, czyli **2.06pp pod pasmem**. **Brama tezy i target alokacji ciagna w przeciwne strony, a framework nie ma reguly pierwszenstwa.** Pytanie do rozstrzygniecia: czy `exit_discipline` ma pierwszenstwo przed `sleeve_targets`, czy brama powinna sie zatrzymywac na dolnej krawedzi pasma. ⚠️ Bez rozstrzygniecia kolejne odczyty WTI <$80 beda generowac proposale trimujace pozycje do zera **mimo ze sleeve jest niedowazony**, a `gate_b` (percentyl cyklu 74.7 = `upper_mid`, licznik 0/2) mowi, ze ropa NIE jest droga cyklicznie.
159
🔧 Semantyka nav.py o 22:30 CEST — walidator zglasza WARN po kazdym poprawnym zapisie post-close ⏳ in progress · due weekly-2026-08-30 — `scripts/nav.py` z konstrukcji pomija bar dnia biezacego (lekcja #30), wiec o 22:30 CEST liczy marki DNIA POPRZEDNIEGO — mimo ze sesja US jest wtedy domknieta od 30 minut. Post-close 8/7 obszedl to jawnym parametrem `--as-of 2026-08-08 --write` (zapis OK, uzgodnienie +0.000%), ale **`validate_yaml.py` wola `nav.py` BEZ `--as-of`** i w efekcie porownuje marki 8/6 z zapisanymi markami 8/7 → **WARN ROZJAZD NAV -0.596% po kazdym poprawnym zapisie**. Czyli walidator karze za wykonanie wlasnosci C2 zgodnie z jej przeznaczeniem. Do zrobienia: albo `nav.py` dostaje swiadomosc godziny (po 22:00 CEST bar US jest rozliczony), albo walidator wola go z tym samym `--as-of` co post-close. **Zgloszone juz 8/6 w innej formie** (»skrypt liczy nadal marki 8/5«) — dzis ta sama przyczyna, inny objaw.
160
🚨 Piaty z rzedu blok post_event_tracking zamkniety BEZ ani jednej sesji w strefie wejscia ✅ done · due weekly-2026-08-16 — Seria po zamknieciu UBER 2026-08-07: **MSFT `chase_dead` · META `expired_no_entry` · CCJ `chase_dead` · GOOG `expired_no_entry` (7/28) · UBER `expired_no_entry` (8/7)** — 5 z 5, zero wejsc. Szosty (MELI) siedzi **0.19 pkt RSI** od tej samej sciezki. **Przy serii 5/5 pytanie »czy okno 7 sesji lapie cokolwiek« przestaje byc retoryczne.** Hipoteza do sprawdzenia: mechanizm wymaga STABILIZACJI (pasmo <=3%), a rynek w biezacym rezimie (VIX 14.90 = minimum cyklu, HY OAS 2.71 = minimum cyklu) reaguje na wyniki w **1-2 sesjach** i wraca do trendu — czyli pasmo nie zdazy sie uformowac, zanim cena ucieknie. Dowod kierunkowy z UBER: pasmo **roslo** w kazdym kolejnym odczycie (3.931% → 4.541% → 9.599%). Do rozstrzygniecia: czy prog pasma jest zle skalibrowany do rezimu niskiej zmiennosci, czy okno jest za dlugie, czy mechanizm jest poprawny a po prostu nie bylo okazji.
161
🔄 Weekly 8/16 framework calibration — recurring od #143 ✅ done · due weekly-2026-08-16 — Weekly 8/16, pięć punktów, każdy z liczbą i porównaniem do dziś: (1) **Composite #4 — czy noga NAAIM ma źródło?** Dziś BEZ DANYCH drugi tydzień; jeśli #120 nadal nierozstrzygnięte, zapisz to jako brak danych **trzeci raz** i podnieś do priorytetu blokującego — trzy runy z nieewaluowalnym warunkiem sterującym zakupami to nie ryzyko, to stan. AAII dziś **37,0**, zapas do progu 40 = **3,0 pkt**. (2) **Cycle drift:** WTI dziś **55,9** (zszedł z 75,2 = zdjęta flaga) — czy wraca nad 75? miedź **99,5 rekord**, złoto **91,4**, srebro **89,7**, SPX **100,0** — czy któryś schodzi pod 75? (3) **Crowded-count** dziś **2/5 + 1 nieznany** (SPX ATH, VIX 14,90 = minimum cyklu). (4) **Alpha WTD** dziś **−1,64pp**; policz ją **z rozbiciem na książkę ryzyka vs T-bille** — dziś książka zrobiła +3,57% ≈ SPY, a całą ujemną alfę zrobiło 44,54% w IB01.L przy +0,05%. **Jeśli ten rozkład się powtórzy trzeci tydzień, to jest argument o alokacji, nie o selekcji.** (5) **Czy DECK się wykonał?** Jeśli nie — dlaczego: brak approvalu (ryzyko procesu) czy brak gotówki (ryzyko kapitałowe, drugi raz ta sama przyczyna).
162
🔄 Weekly 8/16 cash re-decision — recurring od #145 ✅ done · due weekly-2026-08-16 — Pytanie do rozstrzygnięcia: **czy Cash/Yield zbliża się do efektywnego sufitu 32,5%, a jeśli nie — dlaczego.** Stan dziś: **44,54% = +12,0pp nad sufitem** (po TRIM IB01.L 3 sh spadnie do ~40,19% = +7,7pp). Cztery rękawy pod celem: Tactical/Themes 5,05% (7,0-14,0) · Income/Defensive 3,95% (6,5-13,0) · Energy 3,44% (5,0-7,5) · Industrial 1,86% (2,5-5,0). **Wymagane wyjście:** (a) czy TRIM IB01.L + BUY DECK zostały wykonane, (b) czy jest DRUGI kandydat przechodzący Rule #4 (dziś jeden), (c) **jeśli nadal jeden, zapisz jawnie, czy ograniczeniem jest sygnał, polityka czy kapitał** — to rozróżnienie zmieniło się w tym tygodniu i może zmienić się znowu.
163
🔧 cash_buffer.py sizuje pod bufor, nie zna kolejki oczekujących BUY ⏳ in progress · due weekly-2026-08-30 — Znalezione 2026-08-09 przy weryfikacji finansowania `BUY DECK`. `cash_buffer.py --json` zwraca `shares_to_sell: 2` = **$242,80** → wolna gotówka $476,13 = 5,69% NAV, bufor domknięty, **ale nadwyżka nad progiem tylko $57,82 — mniej niż transza DECK $166**. Rec `TRIM IB01.L` wystawiona przez post-close 8/7 na **3 sh = $364,20** jest poprawna; **błąd jest w skrypcie.** Skutek: przy buforze 2% to nie miało znaczenia, przy **5% i transzy 2% NAV skrypt systematycznie proponuje trim za mały, żeby gotowa rekomendacja mogła się wykonać** — czyli odtwarza dokładnie to ograniczenie kapitałowe, dla którego bufor podniesiono 8/7. **Do zrobienia:** `cash_buffer.py` czyta `recommendations.md` i sizuje trim na `max(luka_bufora, luka_bufora + suma transz rec ready_to_execute)`. Klasa defektu: skrypt zna jeden warunek, decyzja wymaga dwóch.
164
⚖️ Prog promocji przy score_max=4 jest LŻEJSZY niż przy 6 — trzy tickery na słabszym barze ✅ done · due weekly-2026-08-16 — Znalezione 2026-08-09 przy audycie KROK 3 (anomalia VIE.PA). **Redukcja `score_max` z 6 do 4 OBNIŻA próg promocji zamiast PODNOSIĆ wymaganą pewność:** przy `score_max: 6` próg to ≥4 = **67%** puli, przy `score_max: 4` to ≥2 = **50%**. Czyli ticker, u którego **trzy z sześciu kryteriów są strukturalnie niedostępne** (brak mapowania ADR), przechodzi **łatwiejszy** test niż ticker z pełnymi danymi. Dotknięte: **ISP.MI (2/4, `promote_candidate`)**, **RHM.DE (2/4, `promote_candidate`)**, **VIE.PA (2/4, counter 2/0 ORAZ soft_drop_proposed=true jednocześnie)**. VIE.PA ma **jedną** spełnioną flagę merytoryczną (`analyst_raise` +11,8%) plus `off_high` = miarę relatywną. **Liczniki tych trzech zamrożone w tym runie** (`counter_frozen: true` + powód). **Do rozstrzygnięcia: albo próg dla score_max=4 idzie na ≥3 (75%), albo tickery z ≥2 strukturalnie niedostępnymi kryteriami mają liczniki zamrożone z definicji** (rekomendowane — zgodne z Lesson #5). Per Lesson #5 licznik zbudowany na puli 2 z 6 potwierdzalnych kryteriów nie może napędzać promocji.
165
⚖️ Doktryna KROK 3 vs guard validate_counter_promote — rozbieżność progu promocji ✅ done · due weekly-2026-08-16 — Ujawnione 2026-08-09 przez WM. **Proza SKILL.md KROK 3 mówi: `counter.positive >= 2` → `promote_candidate` (status field update).** **Guard `validate_counter_promote` w `validate_yaml.py` mówi: pinned pos≥2 jest `actionable` tylko gdy DODATKOWO `rsi_oversold` ORAZ (`insider_buying` LUB `super_investor_new`).** WM ma dziś counter 2/0, RSI 46,37 = nie oversold → guard mówi „0 actionable", doktryna mówi „promuj". **Guard jest ostrożniejszy i ma rację**, co widać na WM: licznik mówi promote, a trzy niezależne testy odrzucają (Crit 7 P/E TTM 32,23 vs mean×0,85 = 24,5-27,3 · dataroma netto −1 · zero zakupów insidera 6m). **Do zrobienia: zapis prozy w SKILL.md dociągnąć do guardu** (promocja wymaga pos≥2 **AND** oversold **AND** akumulacja), żeby te dwa źródła nie mówiły różnych rzeczy. Wymaga edycji SKILL.md przez Dawida.
166
🔧 Enum post_event_tracking.status nie zna `expired_thesis_broken`, a doktryna go używa ✅ done · due weekly-2026-08-16 — Znalezione 2026-08-09 przy zamykaniu bloku TTD. `decision_gate_rule` w bloku TTD (napisana 8/1) wprost przewiduje: „LUB guidance Q3 cięty (= złamanie warunku (a), blok zamyka się jako `expired_thesis_broken`)" — **ale enum w `dashboard/schemas/watchlist.schema.yaml` tej wartości nie zawiera.** Skutek: **zapisanie stanu ZGODNIE Z REGUŁĄ wywala walidator**, a wartość poza enumem wypada z `ACTIVE_STATUSES` i sortuje się na priorytet 99 = **blok staje się niewidoczny dla bramy counter-cycle bez żadnego komunikatu** (Pakiet B2). Obejście zastosowane: `expired_no_entry` + nowe pole `terminal_reason: thesis_broken`. **Do rozstrzygnięcia przez Dawida: rozszerzyć enum o `expired_thesis_broken` (rekomendowane — rozróżnienie „okno wygasło" vs „teza padła" ma znaczenie decyzyjne przy re-entry) albo usunąć to określenie z reguł.** Nie rozstrzygam sam, bo to zmiana schematu.
167
🚨 Cudzysłów polski w skalarze YAML — DZIESIĄTY incydent u tego samego autora ✅ done · due weekly-2026-08-16 — Guard A3 złapał ten sam błąd **dwa razy w tym runie** (linie 2363 i 1370 `watchlist.md`), co daje **10 incydentów w 10 dni**. Weekly 8/2 zapisało argument za normalizacją **w writerze**, nie tylko w walidatorze — i przez tydzień nikt tego nie zrobił, więc dziś argument jest o jeden dowód mocniejszy. **Do zrobienia:** funkcja pisząca bloki YAML normalizuje `„` → `”` i escapuje cudzysłowy proste w skalarach **przed** zapisem; walidator zostaje jako defense-in-depth. **Wzór do nazwania wprost: guard, który łapie ten sam błąd dziesięć razy, nie jest zabezpieczeniem — jest miarą tego, że naprawa jest w złym miejscu.**
168
⚖️ Okno post_event dla mega-capów: 4 sesje vs test pasma — hipoteza z #160 zawężona ✅ done · due weekly-2026-08-16 — Weekly 8/9 dostarczyło **kontrprzykład, który zmienia diagnozę #160**. Hipoteza brzmiała: „okno 7 sesji nie łapie nic, bo w reżimie VIX 14,9 pasmo nie zdąży się uformować". **DECK ją osłabia:** ścieżka (a) używa **identycznego testu pasma (≤3,5%)** i **odpaliła** — pasmo zeszło z 6,66% (7/31) na **1,884% (8/7)** w cztery sesje. Czyli **mechanizm pasma działa.** Co nie działa: **okno 4 sesji dla mega-capów** — MSFT (pasmo 5,831%), META (5,798%) i GOOG zamknęły się na `session-4`, wszystkie trzy z pasmem 1,7-2,8× nad progiem, czyli **zostały zamknięte, zanim pasmo miało szansę się zwęzić**. Dwa bloki z oknem 7 sesji (CCJ, UBER) padły na `chase_dead`/rajdzie, nie na paśmie. **Do przetestowania na danych: czy MSFT/META/GOOG spełniłyby pasmo ≤3,5% w sesjach 5-7, gdyby okno było dłuższe?** To jest pytanie policzalne wstecz (mam zamknięcia) i rozstrzyga, czy zmieniać okno mega-cap z 4 na 7, czy zostawić.
169
✅ NAPRAWIONE 8/9 — dashboard ukrywał 8 kandydatów i rozwalał komórkę Score dla EWS ✅ done · due weekly-2026-08-09 — Dwa błędy renderera znalezione i naprawione w tym runie, oba przez weryfikację outputu zamiast zaufania do „build success". **(1) Filtr statusu wykluczał `promote_candidate`** w `_render_entry_signals_table` ORAZ w rendererze rękawów — a `promote_candidate` jest **dalej** w pipeline niż `verified` (2 positive_check z rzędu), więc filtr działał odwrotnie do intencji. Skutek: **ET 5/6 — jedyny STRONG w całej puli 51 — nie pojawiał się na dashboardzie**, razem z EXE 4/6, MU 4/6, PBR 4/6, TSM 3/6, CB, ISP.MI, RHM.DE = **8 ukrytych nazw w dwóch miejscach**. Tabela: 39 → **47 wierszy**. **(2) `cycle_reasons` z `<` i `>` rozwalało atrybut HTML** — EWS renderował Score jako „70 (overbought); VIX 14.9" zamiast „4/6 ⚙️⚡ ⚠", bo `>70` zamykało tag w `data-tooltip="..."`; brakowało `_esc()`. **Do zrobienia (nie w tym runie):** test regresyjny, który po każdym buildzie sprawdza, że liczba wierszy tabeli == liczba kandydatów po filtrach, i że żadna komórka Score nie zawiera znaków spoza wzorca `N/M`. **Lekcja procesowa: „✅ Wrote index.html" nie jest weryfikacją — przez nieznany czas dashboard nie pokazywał najlepszej nazwy w puli i nikt tego nie widział, bo build zawsze kończył się sukcesem.**
170
⚠️ aaii.com Imperva bot-block — po wygaszeniu NAAIM to JEDYNA pozostała ankieta ⏳ in progress · due weekly-2026-08-30 — Ujawnione 2026-08-09 przy przebudowie health_check. Check `aaii.com` przeszedł **OK → WARN**: 200 OK, ale payload **6 058 bajtów z Imperva/Distil bot-block** zamiast strony z danymi. Tego samego dnia bezpośredni `requests` z UA przeglądarki **zwrócił pełne dane** (bullish 37,0 / neutral 25,0 / bearish 38,0) — blokada jest **niestabilna i zależna od UA**, nie stała. ⚠️ **Dlaczego waży więcej niż tydzień temu:** po wygaszeniu nogi NAAIM **AAII jest jedynym pozostałym odczytem ANKIETOWYM** w crowded-count. CFTC mierzy pozycjonowanie, nie nastroje — więc nie jest zamiennikiem o tej samej naturze. **Do zrobienia:** (1) ustabilizować fetch (UA + retry + jawny WARN gdy payload <20 kB, żeby bot-block nie przechodził jako sukces — ta sama klasa co fałszywy zielony NAAIM); (2) backfill historii AAII, którego **NIE MAM** — `aaii.com/files/surveys/sentiment.xls` zwraca **403**, więc nogi AAII **nie dało się dziś przetestować backtestem tak, jak przetestowano NAAIM**. **To jest luka wiedzy, nie tylko danych: wiem, że druga połowa composite u nie działała, i NIE WIEM tego o pierwszej.**
171
🔧 Czwarta noga testu stabilizacji rudy — do implementacji (zweryfikowana empirycznie w #144) · due monthly-2026-09-01 — Naprawa **potwierdzona liczbami** w weekly 8/16, brakuje kodu. Do bramy (c) `BUY VALE` T2 dopisać czwartą nogę: **„dno 6M nie zostało pogłębione w oknie 10 sesji"**. Dowód: 8/9 trzy oryginalne nogi mówiły TAK przy TIO=F $98,00, a dno 6M zostało pogłębione do **$93,66 dnia 8/3, czyli wewnątrz okna** — test przechodził na cichym zjeździe. Implementacja razem z guardem z #116 (reguła w prozie bez guardu). ⚠️ Praktycznie brama (c) jest dziś martwa niezależnie (13F Q2 netto −2 zabiło T2), więc to jest **naprawa na zapas, nie pilna** — ale zostawiona bez kodu wróci przy następnym cyklu surowcowym.
172
⚖️ post_event: noga cenowa „cum ≤−5%" mierzona w złym momencie — propozycja z dowodem z #160/#168 ✅ done · due weekly-2026-08-23 — Wynik backtestu z weekly 8/16 (GOOG/META/MSFT, komplet liczb w raporcie): **noga pasma i noga ceny nigdy nie są spełnione jednocześnie**, bo pasmo wymaga trzech zamknięć poeventowych, a cena w reżimie VIX ~14 wraca do trendu w 2-3 sesje. Wydłużenie okna nic nie daje (zweryfikowane: 0 dodatkowych wejść przy oknie 7). **Propozycja: zmienić nogę cenową z „cum ≤−5% W SESJI EWALUACJI" na „cum DOTKNĘŁO ≤−5% w dowolnym momencie okna" (minimum kumulaty, nie wartość bieżąca).** Skutek na danych historycznych: **GOOG odpaliłby PROMOTE na sesji 3 (7/27)** — cum_min −6,89% ✓, RSI 37,91 ✓, pasmo 2,561% ✓; META i MSFT nadal nie (META pasmo ✓ dopiero przy RSI 46,96; MSFT cum nigdy). Czyli **1 wejście z 6 zamkniętych bloków zamiast 0** — i akurat to, o którym raport 7/28 sam napisał, że „sygnał zadziałał, ale nie było czym go zrealizować". ⚠️ **Ryzyko zmiany, zapisane uczciwie: łapanie spadającego noża.** „Dotknęło −5%" znaczy, że kupujemy PO odbiciu od dołka, nie na dołku — trzeba rozstrzygnąć, czy to jest wciąż counter-cycle, czy już pogoń za odbiciem. **Nie zmieniam sam — to zmiana reguły wejścia, wymaga decyzji Dawida.**
173
🚨 Trzy pola makro znalezione jako przeterminowane w jednym runie — wspólna przyczyna: brak właściciela kadencji · due monthly-2026-09-01 — Weekly 8/16 znalazło **trzy niezależne pola** niosące nieaktualne wartości, każde inną drogą: **(1) `finra_margin_debt_b_usd` = 1 221 to odczyt za MARZEC, niesiony przez CZTERY miesiące** — realna wartość lipiec **1 417,2 mld**; i to nie jest kosmetyka, bo stara liczba przy MoM −4,5% opisywała delewarowanie, a prawdziwa seria to **+38,6% r/r**, czyli najszybszy przyrost dźwigni w dostępnej historii. **(2) `retail_sales_yoy` = 7,19 zamiast 5,01.** **(3) cache CFTC przeterminowany o tydzień** — `cftc_helper.py` bez `--refresh` raportował raport z 8/4 jako bieżący, podczas gdy 8/11 był dostępny (44,28 → 44,75% OI, percentyl 66,7 → 70,1). **Wspólny mianownik: pole aktualizowane ręcznie albo cache bez polityki wygasania — czyli DOKŁADNIE klasa defektu, którą audyt 7/30 nazwał przy `nav_usd` i dla której stworzono pole `owner`.** **Do zrobienia:** (a) `finra_margin_debt_*` i `retail_sales_yoy` dostają właściciela (propozycja: **monthly**, bo obie serie są miesięczne) plus WARN walidatora przy staleness >45 dni; (b) `cftc_helper.load_history()` odświeża się **automatycznie**, gdy cache jest starszy niż 8 dni (raport tygodniowy + margines).
174
🔧 Pakiet FRED ma dziurę na 2025-10 — każdy YoY liczony pozycyjnie jest cicho błędny ✅ done · due weekly-2026-08-23 — Znalezione w weekly 8/16 przy weryfikacji inflacji. `get_fred_macro_pack()` zwraca serię CPIAUCSL **bez miesiąca 2025-10** (30 punktów zamiast 31). Skutek: `s.iloc[-1] / s.iloc[-13]` liczy YoY względem **2025-08, nie 2025-07** → **CPI 3,54% zamiast 3,30% (+24bp)** i **rdzeń 2,79% zamiast 2,47% (+32bp)**. 🚨 **Błąd jest cichy i ma kierunek: zawyża inflację, czyli popycha wnioski w stronę „reżim się nie zmienia".** Pola w `macro.md` są **poprawne**, bo liczone po dacie — **i wykryte zostało wyłącznie przez sprzeczność z zapisem post-close 8/12, nie przez żaden guard.** **Do zrobienia:** (a) ustalić, czy dziura jest u źródła (FRED/BLS) czy w naszym fetchu; (b) **każdy YoY w repo liczyć przez `pd.DateOffset(years=1)`, nigdy przez `iloc[-13]`** — audyt wywołań; (c) guard w `health_check`: seria miesięczna z luką → WARN z nazwą brakującego miesiąca.
175
⚖️ KROK 3 — licznik automatyczny rozjechał się z checkiem deliberatnym W OBIE STRONY w jednym runie ⏳ in progress · due monthly-2026-09-01 — Audyt anomalii KROK 3, weekly 8/16. Dwa deliberatne checki (najstarsze daty w puli, obie 2026-05-03) dały werdykty **sprzeczne z licznikiem auto-derived, i to w przeciwnych kierunkach**: **BATS.L** — licznik auto **+1** (score 4/6 ≥4), check deliberatny **NEUTRAL** (2 z 5 negatywów potwierdzone jako nieobecne, 3 niedostępne → próg Lesson #5 ≥3 nieosiągnięty). **SAP** — licznik auto **0/0** (score 3/6 = środek, brak jawnych negatywów → neutral reset), check deliberatny **POSITIVE_CHECK weakly** (3 z 5 potwierdzone, zero negatywów, netto +3 w 13F z dwiema NOWYMI pozycjami). **Przyczyna jest jedna i strukturalna: score mierzy OBECNOŚĆ POZYTYWÓW (6 flag), a Lesson #5 wymaga POTWIERDZONEJ NIEOBECNOŚCI NEGATYWÓW — dla emitentów spoza SEC te dwie rzeczy nie mogą się pokrywać**, bo trzy z pięciu kryteriów negatywnych nie mają scrapera. **Nie nadpisałem liczników ręcznie** (Lesson #7 v2: licznik jest auto-derived, ręczna korekta zniszczyłaby jedyne źródło). **Do rozstrzygnięcia: czy Lesson #7 v2 (auto-counter) i Lesson #5 (evidence) mają koegzystować, a jeśli tak — który wygrywa przy sprzeczności.** Powiązane z #164 i #165, które opisują ten sam szew z innych stron.
176
🔄 Weekly 8/23 framework calibration — recurring od #161 ✅ done · due weekly-2026-08-23 — Weekly 8/23, pięć punktów, każdy z liczbą i porównaniem do dziś: **(1) Crowded-count** dziś **2/5** (SPX 0,17% od ATH · VIX 14,25 = minimum cyklu); AAII **34,7** (zapas do 40 = **5,3 pkt**), CFTC **70,1 pct 5Y** (zapas do progu 75 = **4,9pp**). Czy któraś noga odpala? **(2) Cycle drift:** WTI **69,7** (skoczył +13,8pp w tydzień — czy wraca nad 75 i przywraca flagę Rule #4 na rękawie Energy?); miedź **99,5**, złoto **91,6**, srebro **90,1** — czy któryś schodzi pod 75? **(3) Alpha WTD** dziś **−0,10pp**, z rozbiciem: książka ryzyka **+0,48%** vs IB01.L **+0,10%** przy 40,08% NAV. **Warunek „trzeci tydzień" już spełnił się dziś** — pytanie na 8/23 brzmi inaczej: **czy zapadła jakakolwiek decyzja alokacyjna, czy tylko zapis?** **(4) Czy `ADD INTU` T3 się wykonała** — a jeśli nie, to czy z braku zgody (ryzyko procesu) czy z braku trimu IB01.L (ryzyko kapitałowe, **trzeci raz ta sama przyczyna**). **(5) Czy pula ma z powrotem kandydata STRONG (5/6)?** Dziś **zero, pierwszy raz w cyklu** — jeśli drugi tydzień z rzędu zero, to jest wypowiedź o rynku, nie o skanerze.
177
🔄 Weekly 8/23 cash re-decision — recurring od #162 ✅ done · due weekly-2026-08-23 — Pytanie do rozstrzygnięcia bez zmian: **czy Cash/Yield zbliża się do efektywnego sufitu 32,5%, a jeśli nie — dlaczego.** Stan dziś: **46,23% NAV** (IB01.L 40,08% + wolna gotówka 6,15%) = **+13,73pp nad sufitem**. Cztery rękawy: Tactical **6,99%** (7,0-14,0 — **0,01pp pod krawędzią**, czyli po fillu DECK praktycznie na niej), Income **3,80%** (6,5-13,0), Energy **3,67%** (5,0-7,5), Industrial **1,72%** (2,5-5,0). **Wymagane wyjście:** (a) czy `ADD INTU` T3 + towarzyszący trim IB01.L zostały wykonane; (b) czy pojawił się kandydat przechodzący Rule #4 (dziś **zero**); (c) **jeśli nadal zero, zapisz jawnie po raz drugi, że ograniczeniem jest SYGNAŁ** — i wtedy pytanie przestaje dotyczyć gotówki, a zaczyna dotyczyć tego, czy uniwersum 51 kandydatów jest właściwie dobrane do reżimu, w którym wszystko drogie.
178
⚖️ Pierwszeństwo brama wyjścia vs target rękawa — zaostrzone przez wdrożenie #158(b) ⏳ in progress · due monthly-2026-09-01 — Pozostałość po zamknięciu #158: część (b) (próg odporny na szum) wdrożona 2026-08-16, **część (a) nadal bez reguły**. **Pytanie:** czy `exit_discipline` ma pierwszeństwo przed `sleeve_targets`, czy brama zatrzymuje się na dolnej krawędzi pasma rękawa. **Dlaczego pilniejsze niż przed zmianą:** histereza `reset: 84` sprawia, że epizod `warn` trwa dłużej (powrót nad $80 już go nie kasuje), więc brama będzie **częściej** mówić „trimuj" — a IUES.L waży **3,67% NAV wobec pasma Energy 5,0-7,5%, czyli 1,33pp POD** dolną krawędzią. **Ten sam konflikt występuje niezależnie na VALE:** 1,72% NAV wobec pasma Industrial 2,5-5,0% = 0,78pp pod, przy `gate_b` w stanie `near`. Czyli to nie jest przypadek jednej pozycji, tylko **brakująca reguła pierwszeństwa między dwoma mechanizmami, które oba są poprawne osobno**. **Warianty do wyboru:** (i) brama wygrywa zawsze (dzisiejsze zachowanie de facto, bo nikt nie zdefiniował inaczej) · (ii) brama zatrzymuje się na dolnej krawędzi pasma, a dalsze trimy wymagają jawnej zgody · (iii) brama wygrywa, ale trim poniżej pasma automatycznie tworzy zadanie „odbuduj rękaw innym tickerem".
179
🚨 Pięć tickerów ma `promote_candidate` przy counter.positive=0 — status z nieudokumentowanej ścieżki ⏳ in progress · due monthly-2026-09-01 — Znalezione 2026-08-16 przy wdrażaniu #165 (audyt statusu wobec scalonej reguły promocji). **CB, EXE, MU, PBR, TSM mają status `promote_candidate`, a counter.positive wynosi 0** — czyli ich promocja NIE pochodzi z licznika w ogóle. Reguła prozy (`pos>=2 → promote`) i guard (`pos>=2 AND oversold AND akumulacja`) opisują JEDYNĄ udokumentowaną ścieżkę nadania tego statusu, a te pięć wpisów jej nie użyło. Wnioski możliwe dwa i mają różne skutki: (a) istnieje druga ścieżka nadania (monthly discovery scan? ręczna edycja?), która nie jest nigdzie opisana — wtedy trzeba ją udokumentować albo usunąć; (b) to legacy drift po zmianach reguły, wtedy statusy są po prostu nieaktualne. ⚠️ **Dlaczego to nie jest kosmetyka:** `promote_candidate` jest czytany przez `SCORABLE_STATUSES` w score_all_verified i wchodzi do puli scoringowej, a w raportach czyta się go jako sygnał podniesionej gotowości. Pięć nazw niesie ten sygnał bez pokrycia w liczniku. **NIE cofnąłem ich przy #165** — decyzja Dawida dotyczyła rozjazdu doktryna-vs-guard, a to jest osobna klasa (nie rozjazd dwóch reguł, tylko brak reguły). Guard `promote-audit` w validate_yaml.py raportuje je od dziś przy każdym runie, więc problem jest WIDOCZNY zamiast cichy. **Do zrobienia:** ustalić pochodzenie statusu (git blame na watchlist.md per ticker) → udokumentować ścieżkę albo cofnąć do verified.
180
🚨 `beat_raise` dla emitentow pol-rocznych liczy EFEKT BAZY, nie wzrost zysku — BATS.L 4/6 zamiast 3/6 · due weekly-2026-08-30 — Znalezione 2026-08-23 przy weryfikacji BATS.L jako kandydata. **`yfinance_helper.score_international_corporate` uzywa rocznego proxy EPS dla emitentow raportujacych pol-rocznie** (UK/EU) i zapala `beat_raise`, gdy delta roczna jest dodatnia. Dla BATS.L policzylo **EPS 2024 → 2025 = 1,36 → 3,49 = +156,7%** i flaga sie zapalila. **Ale baza 1,36 sama byla odbiciem po stracie −6,47 z 2023** (odpis ~14,4 mld GBP na papierosy w USA), a przychod spada **cztery lata z rzedu** (27 655 → 27 283 → 25 867 → 25 610 mln GBP). Kontrola z niezaleznego pola: `earningsGrowth` = **−28,6% r/r**. **Czyli flaga mierzy wyjscie z roku odpisu i nazywa to `beat_raise`.** 🚨 **Ekspozycja decyzyjna byla realna i policzalna:** przy 4/6 BATS.L wszedl do strefy entry, licznik dostal +1 (2/0 = prog promocji), a guard `validate_counter_promote` oznaczyl go jako **ACTIONABLE** i zazadal »BUY-proposal-or-verdict«. **Uczciwy score 3/6 nie uruchomilby nic z tego lancucha.** **Do zrobienia:** (a) dodac guard bazy — jesli rok bazowy ma **EPS <= 0** albo delta >100%, flaga NIE zapala sie bez kontroli drugiego zrodla (`earningsGrowth` lub kierunek przychodu); (b) rozwazyc zamiane proxy na **CAGR 3-letni** zamiast delty rok-do-roku, ktora jest z natury wrazliwa na odpisy; (c) przeliczyc pozostalych emitentow pol-rocznych w puli (BATS.L, ISP.MI, SSE.L, VIE.PA) pod tym katem.
181
🔄 Weekly 8/30 framework calibration — recurring od #176 · due weekly-2026-08-30 — Weekly 8/30, piec punktow, kazdy z liczba i porownaniem do dzis: **(1) Crowded-count** dzis **3/5** — noga CFTC odpalila po raz pierwszy (**77,8 pct 5Y**, prog >75, zapas nad progiem 2,8pp). **Czy sie utrzymuje drugi tydzien, czy byla jednorazowa?** AAII **35,5** (zapas do 40 = 4,5 pkt) jest dzis JEDYNYM offsetem trzymajacym licznik na 3/5 zamiast 4/5 — jesli AAII przebije 40, licznik idzie na 4/5. **(2) Cycle drift:** WTI **79,3** (wrocil nad 75, flaga Energy przywrocona) · miedz **99,0** · zloto **95,2** · srebro **91,1** · uran **87,3**. **Czy ktorykolwiek schodzi pod 75?** Dzis cztery z pieciu sa restricted — to najwyzszy stan w cyklu. **(3) Alpha WTD** dzis **+2,3839pp** (portfel +1,0160% vs SPY −1,3680%) = **najlepszy tydzien wzgledny w cyklu**, przy czym ksiazka ryzyka dala **+1,8021%**, a IB01.L **+0,03%** przy 38,27% NAV. **Pytanie na 8/30: czy to byl jednorazowy rozjazd stylu (surowce+wartosc vs growth), czy poczatek serii?** Sprawdz, czy prowadza te same nazwy (VALE +7,04 · ISLN.UK +6,89 · INTU +6,17 · 4GLD +5,43). **(4) Czy `ADD META` $59 + noga finansujaca (trim IB01.L ~$60) zostaly wykonane** — a jesli tylko jedna noga, to KTORA. **Czwarty raz z rzedu pytam o towarzyszacy trim IB01.L** (DECK 8/10 pominiety · INTU T3 8/17 pominiety · slip 8/18 na zlym instrumencie · dzis). **Jesli znow pominiety — to przestaje byc incydent, a zaczyna byc wzorzec wykonawczy do nazwania w doktrynie.** **(5) INTU Q4 FY26 (8/25 AMC) — czy print zdjal cap konwikcji MEDIUM?** Wymagany dowod adaptacji AI (przylaczenie Intuit Assist, bookings GenAI). Pozycja **5,56% NAV**, RSI 68,10 wchodzila w print rozgrzana, **−47,95% od szczytu 52W**. Zapisz werdykt: HIGH / MEDIUM utrzymany / degradacja.
182
🚨 Rekawy cykliczne NIE MOGA osiagnac wlasnych celow w etapie `trim` — nadwyzka gotowki i niedowaga to ta sama regula · due weekly-2026-08-30 — Wyodrebnione 2026-08-23 z #177(c) i #178, bo to nie jest juz pytanie o kolejnosc regul, tylko o **skutek uboczny konstrukcji, ktory utrwalil sie na trzy miesiace**. **Stan:** Cash/Yield **43,90% NAV** = **+11,40pp nad sufitem 32,5%**. Cztery rekawy pod celem: **Energy 3,74%** (pasmo 5,0-7,5) · **Industrial 1,82%** (2,5-5,0) · **Income/Defensive 3,71%** (6,5-13,0) · Precious w pasmie. 🔑 **Trzy z czterech niedowazonych rekawow sa CYKLICZNE — a wobec nich framework robi jednoczesnie dwie rzeczy, ktore sie wykluczaja:** (1) etap `regime_stage: trim` obcina im cele o **50%** (mnoznik 0,5), (2) Rule #4 blokuje wejscia, bo **cztery z pieciu surowcow siedza w bracketach `high`/`top_decile`** (miedz 99,0 · zloto 95,2 · srebro 91,1 · uran 87,3 · WTI 79,3). **Czyli sam haircut juz obnizyl cel, a zakaz nie pozwala dojsc nawet do obnizonego.** Efekt: gotowka nie ma gdzie plynac, a rekawy zostaja pod celem — **i to sa dwa widoki tej samej reguly, nie dwa niezalezne problemy.** ⚠️ Czwarty niedowazony rekaw (Income/Defensive, jedyny NIEcykliczny) potwierdza diagnoze od drugiej strony: **jest otwarty dla Rule #4, a mimo to pusty** — jego najlepszy kandydat dzis (BATS.L 4/6) odpadl na Crit 7, a nie na cyklu. **Do rozstrzygniecia przez Dawida (to jest decyzja o polityce, nie wyliczenie):** (a) czy sufit Cash/Yield ma byc **wiazacy** w etapie `trim`, czy swiadomie zawieszony (dzis jest lamany o 11,4pp i nikt tego nie autoryzowal — override wygaszono 7/30); (b) czy rekawy cykliczne maja w etapie `trim` miec cel **0**, zamiast celu obnizonego i nieosiagalnego — bo dzisiejszy zapis generuje falszywy sygnal »niedowaga do uzupelnienia«; (c) czy uniwersum 51 kandydatow jest wlasciwie dobrane do rezimu, w ktorym **cztery piate rekawa surowcowego jest zakazane** — trzeci tydzien z rzedu ograniczeniem jest sygnal, ale przyczyna jest wewnetrzna.
183
🔧 `nav.py` bez retry — ten sam skrypt daje +0,000% i −2,008% w odstepie kilkunastu minut · due weekly-2026-08-30 — Znalezione 2026-08-23. **`nav.py` uruchomiony samodzielnie: uzgodnienie +0,000%, komplet 14 pozycji wycenionych rozliczonymi zamknieciami 8/21.** **Ten sam skrypt wywolany przez `validate_yaml.py` kilkanascie minut pozniej: cztery pozycje bez ceny (GEHC, MELI, INTU, VALE) → WARN `ROZJAZD NAV −2,008% ($−170,29)`.** Przyczyna nie jest ksiegowa ani semantyczna — **yfinance w tym srodowisku zwraca timeouty losowo**, co potwierdzono niezaleznie w KROK 0 (ten sam fetch MSFT: FAIL / OK / OK w trzech kolejnych probach) oraz w KROK 2 (batch download zgubil 7 z 15 tickerow, per-ticker retry odzyskal 15/15). 🚨 **Dlaczego to wazy wiecej niz zwykly flake: komunikat »ROZJAZD NAV −2,008%« jest NIEODROZNIALNY od realnego rozjazdu ksiegowego** — a to sa dwie zupelnie rozne rzeczy i tylko jedna wymaga reakcji. Walidator uczy wiec ignorowac wlasny alarm. **Do zrobienia:** (a) `nav.py` pobiera per-ticker z **retry + backoff** (wzorzec sprawdzony dzis: 4 proby, sleep 2s → 15/15 pokrycia); (b) przy niepelnym pokryciu **fail-loud z nazwa brakujacego tickera i liczba prob**, NIE cicha wycena po cenie wejscia — bo to wlasnie ona generuje falszywy rozjazd; (c) rozwazyc lokalny cache ostatniego znanego rozliczonego zamkniecia jako fallback. Powiazane z #159 (ta sama funkcja, inna warstwa).
184
🚨 Archiwizacja wierszy catalysts.md jest MECHANICZNA — wiersz z błędną datą archiwizuje się jak poprawny · due weekly-2026-08-30 — Znalezione 2026-08-23 na sobie samym. Ten run napisal w `catalysts.md` **Jackson Hole 8/20-22 ROZSTRZYGNIETE**, mimo ze **Lekcja #47 z 2026-08-21 poprawila te date o tydzien** — sympozjum jest **8/27-29** (potwierdzone niezaleznie: Kansas City Fed). Czyli zdarzenie o randze rezimowej zostalo opisane jako zamkniete **dwa dni po tym, jak framework poprawil jego date**, i wyladowalo w oknie 'zarchiwizowane' zamiast w oknie 'nadchodzace'. Zlapane w tym samym runie przy czytaniu journala, ale **dopiero po zapisie pliku**. 🚨 **Mechanizm: KROK 8a wymusza przesuniecie NAGLOWKOW okna (`Ten tydzien` x2), ale archiwizacja wierszy jest operacja czysto mechaniczna — `data < dzis` → wytnij.** Wiersz z BLEDNA data przechodzi ten test tak samo gladko jak poprawny, a po archiwizacji blad **zyskuje status faktu dokonanego** i nie ma juz gdzie zostac zauwazony. **Do zrobienia:** (a) przy archiwizacji wiersza oznaczonego 🚨/🚨🚨 (ranga rezimowa) wymagac **potwierdzenia daty z zewnetrznego zrodla** przed wycieciem, zamiast samego porownania dat; (b) dopisac do checklisty KROK 8a punkt 'czy zdarzenie oznaczone jako rozstrzygniete FAKTYCZNIE sie odbylo'; (c) rozwazyc pole `date_verified_on` przy wierszach o randze rezimowej. 📌 To jest **druga strona** tej samej checklisty, o ktorej mowi Lekcja #47 ('pilnuje tylko jednej strony') — tam chodzilo o naglowki, tu o tresc.
185
🚨 finviz_helper.get_market_insider() ZEPSUTY — regresja upstream między 8/21 a 8/24 ✅ done · due weekly-2026-08-30 — `finvizfinance/insider.py:67` robi `self.soup.find_all("table")[6]`, a strona Finviz podaje dziś **2 tabele** — dane insiderskie siedzą pod indeksem **1**. `IndexError: list index out of range` na wszystkich trzech opcjach (`latest` / `latest buys` / `latest sales`). **Regresja jest świeża: post-close 8/21 raportował 400 przeskanowanych wierszy Form 4, dziś zero.** 🔑 **Klasa defektu jest ta sama co #134 (`screen_quality_value()`): zależność od pozycyjnego indeksu w HTML strony trzeciej.** Poprawka powinna szukać tabeli **po nagłówkach** (`Ticker`/`Owner`/`Relationship`/`Date`/`Transaction`), nie po numerze — wtedy kolejna zmiana layoutu jej nie zabije. ⚠️ **Do rozstrzygnięcia osobno: czy KROK 7 ma failować głośno.** Dziś helper rzucił wyjątek i to było dobre — ale gdyby zwrócił pustą listę, raport napisałby »zero trafień insiderskich« i **brak danych byłby nieodróżnialny od braku sygnału** (Lesson #5: »data unavailable ≠ confirmed absence«).
186
🔧 exit_discipline.py — CLI bez `--as-of`, próg liczony na wczorajszych zamknięciach · due weekly-2026-08-30 — `evaluate(as_of=...)` przyjmuje parametr, ale `_cli()` go **nie wystawia** i woła `evaluate()` bez argumentu. Skutek: `nav.py` pomija bar dnia bieżącego (Lekcja #30, słusznie dla runów śródsesyjnych), więc **post-close — jedyny run z rozliczonymi zamknięciami dnia — porównuje `stop`/`target` z cenami WCZORAJSZYMI.** 📌 **Dziś bez skutku i to jest jedyny powód, dla którego to jest `default`, a nie `blocker`:** oba warianty (`as_of` 8/24 i 8/25) dały **0 trafień**. Ale progi wyjścia są jedyną regułą w systemie, która ma zamykać pozycje — **dzień opóźnienia na stopie to dzień, w którym stop nie działa.** Poprawka: `ap.add_argument("--as-of")` + przekazanie do `evaluate()`, i wywołanie w SKILL-cie z `--as-of {jutro}`. Ta sama uwaga dotyczy `cash_buffer.py`, który flagę **ma** — czyli asymetria jest przypadkowa, nie zaprojektowana.
187
🚨 Trzy pola `insider_buying` rozjechane z rzeczywistością — ujawnione przez naprawę #185 · due weekly-2026-08-30 — Skan po naprawie helpera (882 wiersze, 13 trafień) daje trzy sprzeczności z `watchlist.md`, wszystkie na nazwach decyzyjnie żywych:
• **BABA** — `status: rejected`, `last_scored: 2026-07-26`, `insider_buying: {met: false, "0 buys 30d"}`. **Dziś dwa zakupy insiderskie tego samego dnia: Tsai Joseph C (Director, współzałożyciel) $10,29 mln + Wu Yongming (CEO) $4,98 mln = $15,27 mln.** Pole ma miesiąc i jest jawnie sprzeczne. BABA otworzyła −1,74%.
• **MU** — `status: promote_candidate`, `insider_buying: {met: true, "2 insider buys 30d"}`. **Skan pokazuje CLUSTER SELLING: 3 zgłoszenia / 2 członków zarządu / 4 sesje / $67,6 mln** (Mehrotra $39,59 mln, Sadana 2× $14,01 mln). **Pole niesie sygnał kupna w nazwie, z której zarząd wychodzi** — a status to `promote_candidate`. MU −6,87% na otwarciu.
• **ET** — `insider_buying: {met: true, "5 insider buys 30d"}` zgodne co do kierunku, ale **nie zna skali**: Kelcy Warren (założyciel) kupił **$21,26 mln w dwie sesje (18-19 sie)** = największy zakup insiderski w skanie.
⚖️ **Post-close świadomie NIE wystawił tu żadnej rec** — wszystkie trzy to watchlista, a flash-BUY na watchlist bez pełnej oceny counter-cycle jest framework-bypassem (doktryna 2026-04-28). **Ocena należy do KROKU 5 weekly.**
🔑 **Pytanie szersze, które te trzy przypadki stawiają razem: jak długo `entry_signals` mogą być stale, zanim przestaną być sygnałem?** BABA ma pole sprzed miesiąca na nazwie odrzuconej — czyli odrzucenie utrwala stan wiedzy z dnia odrzucenia i nic go nie odświeża.