Co to znamená
Pravidlo project.conventional-commits dříve uvádělo, jak má commit vypadat, a končilo větou „Žádný příkaz o tomto pravidle nerozhoduje; rozhoduje recenzent.“ To je uvedená invariance, za kterou nic nestojí, a měření provedené v den jejího nahrazení říká, kolik to stálo: z 1161 ne-mergových commitů 48 předmětů přesáhlo i šířku, kterou tento projekt deklaruje pro řádek čehokoli, a 38 neslo slovo typu, které žádný slovník neobsahoval. Nikdo si nevšiml, protože se nic nedívalo.
Tvrzení je, že zpráva se nyní posuzuje příkazem v okamžiku, kdy ji někdo píše — a že posouzení je tentýž, jaký kontrola aplikuje na historii, a tentýž, který agent dostává přes MCP.
Princip
Jeden parsing. commit::CommitHeader::parse přečte předmět na slovo typu, rozsah, značku zásadní změny a předmět a nikdy neselže. release::commits::parse — čtečka changelogu, která existuje, co existuje changelog — se na něj odvolává. Obě volající strany se liší jen v tom, co dělat s hlavičkou, která není konvenční: changelog ji nese, protože changelog, který zahodí to, co nedokáže klasifikovat, lže vynecháním; soudce ji hlásí.
Jedna politika jako data. commit: v .ai/repo/policy.yaml nese šířku předmětu a čtyři úrovně; majordomus.policy/v1 vlastní její tvar a share/allow/policy.txt se generuje z tohoto schématu, takže přidání klíče je jedna úprava a přegenerování místo úpravy na třech místech. Slovník typů tam záměrně není: je to ChangeKind, ze kterého changelog už vykresluje nadpisy.
Jeden soudce, tři volající. commit.validate bere zprávu, slovník, cesty, jsou-li známy, a id záznamů, které vrstva drží, a vrací typované nálezy nad vlastním Diagnostic repozitáře. .githooks/commit-msg se ho ptá s git diff --cached --name-only, což je jediný okamžik, kdy existuje zpráva i soubory — proto se commit.fix_without_test může ptát tam a záměrně se neptá historie, kde důkazy chybí a soud by byl hádáním. scripts/ci/commit-policy se ptá commit.history, který posoudí 1788 commitů za 992 ms — jeden proces pro celý rozsah místo jednoho na commit, což mu umožňuje být kontrolou, ne nočním jobem.
Hook je deklarován v seznamu enforcement politiky jako commit-policy-on-message, zapojen přes git-hook:commit-msg, takže jej majordomus doctor drží tak, jak drží doctor-on-commit a derived-current: cesta se musí rozřešit, být spustitelná, být volána pojmenovaným artefaktem a její exit kód nesmí být spolknut. Pravidlo se vynucuje dvakrát — hook odmítne zprávu a doktrína odmítne repozitář, který hook odpojí.
Jak to vidět
echo "update stuff" | majordomus commit validate # exit 10: commit.not_conventional
echo "fix(plan): a thing under I9999" | majordomus commit validate
# exit 10: commit.unresolved_reference
echo "Merge pull request #1 from a/b" | majordomus commit validate
# exit 0: exempt, git composed it
majordomus commit history origin/master..HEAD # this branch's commits
scripts/ci/commit-policy # the gate
majordomus doctor | grep commit-policy-on-message # OK wiring … via .githooks/commit-msg
bash test/run.sh 274_commit_policy # the behavioural caseCo nepokrývá
Neposuzuje, zda je předmět dobrá věta, zda je změna atomická ani zda stála práce za udělání. To rozhoduje recenzent a validátor, který by předstíral opak, je validátor, kterému nikdo nevěří.
Je to lokální hook, takže váže toho, kdo má git config core.hooksPath .githooks. Commit vytvořený bez něj nebo merge přes forge jím neprojde; kontrola commit-policy v CI je záchranná síť a drží vlastní commity větve politice rovnou, bez základní hodnoty, právě proto, že hook je měl odmítnout již dříve.
54 commitů této historie nesplňuje politiku. Všechny jsou publikované, takže jejich přepsání nepřichází v úvahu; počet žije v .ai/repo/commit-policy-baseline.txt a kontrola selže, když stoupne, místo aby předstírala, že je historie čistá.
Proč existuje
Postup psaní commitu — odvodit rozsah z cesty, propojit práci, nevymýšlet číslo úkolu, oprava potřebuje test — dřív žil v próze, kterou AI klient četl a prováděl ručně, jeden soubor na klienta, s tabulkou cesta-rozsah udržovanou člověkem. Workflow, jehož sémantika žije v promptu, je neverzované, nevynutitelné, netestovatelné a pravdivé pro právě jeden nástroj. Parser, který o tom mohl rozhodnout, byl v tomto repozitáři celou dobu a četl historii pro changelog. Chyběla nikoli gramatika. Chyběl verdikt a okamžik, kdy promluví.