Zdůvodnění
Deriver zapíše kandidáta při každé hranici epizody, která přinesla důkazy, a nic jej neodstraní kromě osoby, která jej povýší nebo zamítne. Ponechán sám si adresář roste a fronta, která roste bez hranic, není fronta, kterou někdo čte. project.accumulation-is-measured říká, že cokoli, co roste samo, se měří a hlásí dřív, než je to problém; toto pravidlo je takové měření pro frontu revize.
Zda si kandidát zaslouží povýšení, je úsudek, a stroj, který by vyprázdnil frontu, by jej činil. Proto je pravidlo jen doporučením: pojmenuje, co se nahromadilo, a nic nezastaví. Spouští se pouze z doctor, protože pod watch je doporučující nález drift a příkaz skončí kódem 11, a plná fronta revizí nesmí zčervenat watch v hooku.
Dva ze tří nálezů se týkají času a počtu a třetí viditelnosti. Kandidáta, kterého strom nesleduje, neobjeví nic: index ho nevidí, graf ho nevidí, žádný povrch ho neservíruje a druhý checkout ho nikdy neposoudí. Je pojmenován, aby ho člověk přidal vedle záznamu relace, o což už žádá samotný výstup deriveru.
Tato náprava je commit a trunk, který se mění jen přes pull requesty, ho udělat nemůže. Proto deriver na trunku do candidates/ nezapisuje vůbec: kandidáta s relačním záznamem epizody uloží do outboxu lokálního pro checkout .ai/local/state/outbox/ a další hranice epizody na jiné větvi klonu jej přesune do candidates/, kde jej pull request té větve doveze na trunk (ADR 0091 a jeho dodatek). Toto pravidlo od trunku nikdy nežádá commit, který nemůže udělat.
Požadované chování
Kandidáti se revidují, nehromadí. Více záznamů s status: candidate než knowledge.candidates_max_files, kandidát, jehož stáří review přesáhne knowledge.candidate_max_age_minutes, nebo kandidát pod candidates/, který správa verzí nesleduje, je zjištění, které je pojmenuje. Obě čísla jsou deklarována jednou v politice a čtou je všechny povrchy; nahrazený záznam zůstává pod candidates/ a nepočítá se do žádného z nich.
Kandidát připravený v outboxu není pod candidates/, takže se zde nepočítá ani nehlásí jako nesledovaný. Není skrytý: dokud ho nenese nějaká větev, context vypíše řádek a doctor nález INFO outbox v kategorii clone, přičemž každý jmenuje, kolik záznamů relací a kandidátů čeká v .ai/local/state/outbox/. Soubor tam, který není záznam, zůstane na místě a epizoda, která by ho nesla, ho jmenuje na standardním chybovém výstupu; počítá se, dokud ho člověk nepřesune nebo neodstraní.
Stáří revize je stáří položky fronty, ne důkazů. Měří se od nejstaršího řádku knowledge.derived, jehož cesty soubor pojmenovávají, s návratem k commitu, který soubor přidal, a teprve poté k date záznamu; nález říká, který zdroj použil. date záznamu je den důkazů a je deterministický, takže kandidát odvozený dnes z loňského rozhodnutí čeká od dneška.
Chování při selhání
Porušení je nález WARN v kategorii knowledge, jmenující cesty (až několik, pak počet) a který práh nebo podmínku překročily; příkaz pokračuje a končí tak, jak by končil jinak. Reprodukce pro nálezy fronty je majordomus knowledge candidates; pro nesledovaného kandidáta je git status --porcelain .ai/repo/knowledge/candidates a náprava následuje po fix: ve zprávě: git add .ai/repo/knowledge/candidates && majordomus derive. Politika, která nedeklaruje ani knowledge.candidates_max_files, ani knowledge.candidate_max_age_minutes, se hlásí ve vlastní třídě tohoto pravidla, jmenující chybějící klíč, tak jako se hlásí stropy retence.
Ověření
mj_validate_knowledge_accumulation o tom rozhoduje, volané z doctor. Behaviorální případ test/cases/711_candidates_are_reviewed_not_accumulated.sh to dokazuje — limit, stáří, nesledovaný soubor a chybějící klíč jsou každý nálezem správné úrovně a watch to neovlivňuje — a CI tento případ spouští.