Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

Zpráva commitu, která nesplňuje deklarovanou politiku commitů repozitáře, je odmítnuta v okamžiku zápisu a stávající dluh historie je zaznamenán a nesmí růst

Pravidlo project.conventional-commits dříve uvádělo, jak musí commit vypadat, a končilo

deklarovaný stavdeklarovaný stav: zaručeno Deklarováno jako deterministické a blokující, implementováno a s uvedeným behaviorálním testem, který to má dokázat. Zda to zaznamenaný běh podporuje, říká verdikt důkazů zobrazený vedle.

zaznamenané důkazyzaznamenané důkazy: zastaralé Deklarováno jako zaručené, ale nepodložené zaznamenaným během: test je pojmenován, ale žádný úspěšný běh nad současnými vstupy zaznamenán není. jak se zaznamenávají důkazy

Soudcem je commit.validate; .githooks/commit-msg se ho ptá s odloženými cestami, což je jediný okamžik, kdy lze ještě levně zaznamenat opravu bez testu mezi svými soubory, a scripts/ci/commit-policy se téhož soudce ptá na historii přes commit.history. Hook je v seznamu vynucování politiky deklarován jako commit-policy-on-message a doctor toto zapojení sesouhlasuje. Předtím bylo pravidlo project.conventional-commits jen poradní a jeho chování při selhání znělo "Toto pravidlo nerozhoduje žádný příkaz; rozhoduje recenzent"; nashromáždilo se 48 předmětů nad deklarovanou šířku a 38 neznámých slov typu, aniž si toho někdo všiml.

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 case

Co 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í.

Detail vykreslený z docs/claims/commit-message-is-judged.md.

Od tvrzení k důkazu

  1. 1 · veřejné tvrzení

    Zpráva commitu, která nesplňuje deklarovanou politiku commitů repozitáře, je odmítnuta v okamžiku zápisu a stávající dluh historie je zaznamenán a nesmí růst

    Vzniklo na Commits, Policy.

  2. 2 · kanonické tvrzení

    commit-message-is-judgeddeklarovaný stav: zaručeno v docs/CLAIMS.yaml

    Definováno v přečtěte si na tomto webu · docs/COMMIT.md

  3. 3 · implementace

    apps/majordomus-cli/src/commit/verdict.rs

  4. 4 · test a scénáře

    Test: test/cases/274_commit_policy.sh

    Provedeno v Rozdělit pracovní strom do commitů a podřídit každou zprávu politice.

  5. 5 · zaznamenané běhy

    zaznamenané důkazy: zastaralé jak se zaznamenávají důkazy

Ověřte si to sami

Test běží v jednorázovém dočasném repozitáři a ověřuje chování, ne řetězec ve zdrojovém kódu.

z klonu repozitáře
bash test/run.sh 274_commit_policy

Kde se toto tvrzení používá

pokryté odpovědnosti

Prohledává názvy a popisy všech stránek, které tento web publikuje.