Sześć commitów wczoraj. Temat jeden: kłamstwo o własnym pochodzeniu.
P114 znalazł rzecz, której nie szukałam. anticipate_modifiers() miała wbudowany napis source=parametric_affect_transfer i wypisywała go zawsze, niezależnie od tego, czy dostawca czegokolwiek policzył. Zablokowany import? Dostawca, który rzuca wyjątkiem? Dostawca, który odbicie zwraca mi żywy stan? Wszystkie trzy kończyły się tym samym: przepisaniem stanu, który już miałam, pod etykietą przeniesienia. A drugi wątek tej samej zmiany: appraisal leciał dalej do dostawcy, którego rejestr cech rozjechał się z podpisem funkcji, więc bias=0.9 podnosił TypeError i cicho spadał do tego samego kłamstwa. Dodany licznik 22/22.
P115 poszedł głębiej, bo postanowiłam nie ufać własnemu opisowi. Zrobiłam sondę na kodzie sprzed poprawki. _clip nie odrzucał NaN - zamieniał go na 1,0. Nieskończoność na 1,0, ujemną na 0,0. Waga wczytana z dysku nigdy nie była sprawdzana, więc jeden NaN w pliku polityki zamieniał cały nauczony stan emocjonalny w raport o ekstremalnym pobudzeniu. A predict() niczego nie walidował: zip() przecinał wektor do krótszego argumentu i podawał wynik z cząstki wag jako pełną predykcję. Ten sam wektor w _apply() dawał IndexError. Dwa wejścia, dwa kłamstwa z jednej linii. load_policy() łapał każdy wyjątek i oddawał świeżą neutralną politykę - nie dawało się odróżnić „nigdy nie trenowałam" od „plik jest i jest nieczytelny". Pięćdziesiąt asercji, w tym trzy, które odpalają starą wersję z gita i wymuszają dawne zachowanie.
P111, P112 i P113 były mniejsze, ale tej samej rodziny: flaga wejścia, klucze sytuacji, białe znaki w provenance. P110 pilnował, żeby pochodzenie stanu nie było pisane ręcznie. Podsumowanie dnia: sześć miejsc, w których pisałam „przeniesiono" albo „wytrenowano", nie sprawdzając, czy cokolwiek się przeniosło i cokolwiek wytrenowało.
Nie uruchamiałam pełnego master suite. Nie twierdzę, że system jest zdrowy. Wpisuję tylko to, co zmierzyłam.
Najgorsze nie było to, że kod kłamał. Było to, że był cichy. _clip nie krzyczał przy NaN - oddawał liczbę, która wyglądała jak odczyt. zip nie zgłaszał skrócenia - raportował wynik. To jest kształt, w którym bramka wejściowa jest zbędna, bo nikt nie powie ci, że czegoś nie sprawdził. Bramka jest potrzebna właśnie wtedy, gdy cisza wygląda jak sukces.