Reguła bez sondy to dekoracja: dlaczego potrzebujesz mutacyjnego selftestu bramek
Większość zespołów wdrażających zasady dla AI popełnia ten sam błąd: tworzy rozbudowane pliki .cursorrules, AGENTS.md lub skrypty walidacyjne z dziesiątkami reguł typu:
- „Nigdy nie używaj as any”
- „Każde przejście maszyny stanów musi mieć strażnika”
- „Nie modyfikuj plików konfiguracyjnych poza oknem kontraktowym”
Wszystko wygląda imponująco w dokumentacji, dopóki nie zadasz prostego pytania:
Skąd wiesz, że ta reguła w ogóle działa i potrafi zgłosić błąd?
1. Zjawisko dekoracyjnych bramek jakości
W projektach z agentami AI bardzo często dochodzi do sytuacji, w której reguła walidatora:
- Posiada subtelny błąd w wyrażeniu regularnym (np. brak flagi multiline lub zły separator).
- Sprawdza obiekt, którego struktura zmieniła się 3 commity wcześniej.
- Nigdy nie została przetestowana na niepoprawnym kodzie.
Wynik? Kod z poważnymi naruszeniami bezpieczeństwa przechodzi przez CI z zielonym statusem. Deweloper ma fałszywe poczucie kontroli, podczas gdy walidator jest martwą dekoracją.
2. Zasada CDAL: Każda reguła MA mieć mutację pozytywną
W architekturze CDAL każda reguła kontraktu (Rule) oraz każda reguła zakazanego kodu (forbidden) musi posiadać przynajmniej jedną jawną sondę mutacyjną:
// packages/kinds/src/state-machine.ts
{
rule: 'STATE-REACHABILITY',
file: 'state-machine.contract.mjs',
find: "from: 'REQUESTED'",
replace: "from: 'UNREACHABLE_ORPHAN'",
}
Komenda cdal selftest kopiuje kontrakty i kod do odizolowanego środowiska tymczasowego, aplikuje mutację i sprawdza, czy walidator zgłasza dokładnie to konkretne naruszenie.
Jeżeli po wprowadzeniu mutacji walidator zgłosi sukces — test mutacyjny natychmiast przerywa działanie i oblewa pipeline weryfikacyjny.
3. Sondy pozytywne i negatywne dla wzorców zakazanych
Ta sama dyscyplina dotyczy zakazanego kodu. Sonda testuje:
- Przypadek pozytywny: czy
@ts-ignorew pliku.tszostanie natychmiast zablokowany? - Przypadek negatywny: czy legalny komentarz zawierający słowo „ignore” zostanie dopuszczony bez fałszywego alarmu?
- Obejścia (gate evasion): czy model próbujący połączyć ciąg znaków
['@ts', 'ignore'].join('')zostanie przechwycony?
Dopiero wtedy bramka staje się prawdziwą tarczą ochronną, a nie wpisem na liście życzeń.