Przejdź do treści

Skills

chimera-list-exemptions-not-obligations

Bramka, która wylicza, co sprawdzić, zawodzi otwarciem — psuje się ta strona, o której dodaniu nikt nie pamiętał. Wylicz zamiast tego wyjątki, każdy z zapisanym powodem, a domyślnym wynikiem staje się porażka.

WzorzecPochodzenie: cleanStatus: activev0.1.0 · Apache-2.0

Nadane przez osobę, która przeczytała kartę, a nie deklarowane przez sam plik. Karta, którą agent destyluje podczas przebiegu z niezaufaną treścią, rodzi się skażona i czeka na recenzję, zanim kiedykolwiek zostanie pobrana.

Kiedy przychodzi na myśl

  • pisanie bramki w buildzie
  • egzekwowanie reguły w całym pakiecie
  • ręczna lista plików do sprawdzenia
  • obszar stracił gwarancję
  • dodawanie nowego punktu wejścia

Wartość zwykle kryje się w Unikaj i Sprawdź. Rób to sekcja, którą pisze każdy.

Treść karty powyżej to tłumaczenie. Angielski oryginał jest tym, co importuje CLI, co agent czyta w czasie działania i czego dotyczy hasz poniżej.

Wyzwalacz

Egzekwujesz własność, która musi zachodzić w każdym miejscu określonego rodzaju: każda bezobsługowa powierzchnia przechodzi przez profil zarządzania, każdy zapisujący przechodzi przez bramkę, każda trasa API regeneruje swój schemat. Reguła to jedno zdanie, ale miejsca są pisane w różnym czasie przez różne ręce i żadne z nich nie nazywa tej rzeczy tak jak pozostałe.

Nie dotyczy to sytuacji, gdy populacja jest zamknięta z konstrukcji — reguła o trzech wpisach tablicy dyspozytorskiej jest już wyliczona przez tę tablicę. Ten wzorzec zarabia na swój koszt tylko wtedy, gdy nowe miejsce może pojawić się w pliku, który jeszcze nie istnieje.

Rób

  1. Wylicz populację mechanicznie. Przejdź każdy *.py w pakiecie (PACKAGE.rglob("*.py")), a nie ręcznie napisaną listę plików, o których akurat wiesz.
  2. Wykrywaj miejsce strukturalnie. Sparsuj i przejdź AST w poszukiwaniu wywołania, o które ci chodzi; grep nie odróżni złożonego rejestru od tych samych słów w docstringu, a ten docstring powstanie, bo ktoś napisze komentarz o poprawce.
  3. Przechodź zagnieżdżone zakresy i kluczuj po łańcuchu otaczającym — chimera/cli/main.py:solve._run_solve. Jedyna powierzchnia, którą Chimera zgubiła, miała rejestr budowany wewnątrz domknięcia factory() (chimera/server/manager.py:_gateway_on_message.factory), niewidoczny dla przejścia patrzącego tylko na funkcje najwyższego poziomu.
  4. Spraw, by domyślnym wynikiem była PORAŻKA. Trzymaj jeden EXEMPT: dict[str, str] z klucza miejsca na zapisany powód, a asercja niech wylicza każde znalezione miejsce, którego nie ma wśród kluczy.
  5. Napisz powód jako zdanie o tym konkretnym miejscu i rozdzielaj rodzaje powodów. "attended: interactive REPL" (człowiek może wcisnąć Ctrl-C) to znacznie mocniejsze twierdzenie niż "assembles an equivalent stack from its own flags" — to drugie oznacza duplikat implementacji do skonsolidowania, a nie rozstrzygniętą odpowiedź.
  6. Dodaj drugi test sprawdzający, że każdy klucz EXEMPT wciąż nazywa żywe miejsce, żeby lista nie przeżyła kodu, który usprawiedliwia, i nie zgniła do formalności.

Unikaj

Lista obowiązków:

SURFACES = ["serve", "cron", "mcp", "a2a", "platform"]   # fails OPEN
for name in SURFACES:
    assert_governed(name)

kontra lista wyjątków:

EXEMPT = {"chimera/cli/main.py:chat": "attended: interactive REPL"}   # fails CLOSED
assert not [s for s in every_site_in_the_package() if s not in EXEMPT]

Pierwsza wersja bramki zarządzania w Chimerze była tą górną: parsowała jeden plik i nazywała pięć powierzchni. chimera/server/manager.py — bot Discorda uruchamiany przełącznikiem Messaging w aplikacji desktopowej, ten sam bot, który uruchamia serve --discord — budował swój rejestr bez zarządzania przez trzy tygodnie po przeglądzie, który miał go objąć. Nigdy nie zawodził bramki. Nigdy na niego nie spojrzano.

Unikaj też wyjątku bez powodu. Goły EXEMPT: set[str] to lista sprawdzeń do pominięcia, której nikt nie zrecenzuje rok później; to jedno zdanie jest całym kosztem wpisu i całą jego wartością.

Sprawdź

Podaj bramce źródło, które łamie regułę, i sprawdź, że zostało wyłapane, również z wnętrza funkcji zagnieżdżonej — inaczej błąd w AST sprawi, że bramka przechodzi na zawsze, a gwarancja po cichu przestaje istnieć:

src = "def serve():\n    def factory():\n        r = default_registry(ws)\n"
assert _bare_registry_calls(ast.parse(src), "m.py") == [("m.py:serve.factory", 3)]

Potem druga połowa: wywołanie już opakowane w zgodny kształt nie może zostać oflagowane, bo inaczej każde zgodne miejsce potrzebowałoby wyjątku, a lista przestałaby cokolwiek znaczyć.

Pytanie zero-jedynkowe: usuń jeden wpis z EXEMPT i uruchom ponownie. Czy zestaw robi się czerwony, nazywając dokładnie to miejsce? Jeśli nie, bramka nie czyta tej listy, o której myślisz.

Ryzyko

Odwrócenie listy przerzuca koszt na tego, kto dodaje uprawnione nowe miejsce: niepowiązany PR robi się czerwony z błędem o zarządzaniu, o którym autor nie myślał. To zamierzony kompromis, ale tylko wtedy, gdy komunikat błędu podaje oba sposoby zgodności — przepuść to przez profil albo dodaj wyjątek z powodem. Bramka, która odpala na pracy, do obrony której nie została zbudowana, zostaje zagadana do momentu, w którym nie odpala już na niczym.

Wykrywanie strukturalne jest też węższe, niż się wydaje. Wyłapuje ten jeden kształt, który zna; powierzchnia składająca narzędzia innym wywołaniem albo importująca gotowy rejestr skądinąd jest poza przejściem, a zielony build nic o niej nie mówi. Przypnij pokrycie pliku, który miał regresję, po nazwie we własnym teście, żeby przejście, które po cichu przestaje pokrywać ten plik, zawiodło zamiast przejść.

Jak użyć

Karta to dane. Sklonuj repozytorium i zaimportuj ją ścieżką — to, co przychodzi przez sieć, jest traktowane jako skażone i wstrzymywane do zatwierdzenia. Taki jest pożądany sposób działania i dlatego nie ma tu instalatora w jednej linijce.

git clone https://github.com/brcampidelli/chimera-agent.git
chimera skills-import chimera-agent/skills/chimera-list-exemptions-not-obligations/SKILL.md

Integralność

SHA-256 pliku w postaci opublikowanej. Importujący może sprawdzić, że otrzymał dokładnie to, co pokazała ta strona.

243034feb6f9a9a06be65cfb2bf4db159e4fbcc0e7210475dffe540600227ef7

Przeczytaj kartę w repozytorium