25. Pořadí prezentace je jedno totální pořadí, které vlastní crate, ne rozhodnutí každého povrchu
Kontext
Každý fakt, který tento repozitář ukazuje, byl zredukován na jednu deklaraci a mnoho projekcí: schopnost se deklaruje jednou a dosáhne MCP, HTTP, OpenAPI, příkazové řádky, Cockpitu i generované reference, aniž by kterákoli držela definici (ADR 2, ADR 4, ADR 5); objekt vrstvy je soubor a každý povrch, který ho ukazuje, je odvozen (ADR 7, ADR 8, ADR 18); webový povrch se objevuje od svého producenta a rozpoznává se jednou (ADR 13). Jedna vlastnost kolekce touto redukcí nikdy neprošla a je to ta, kterou člověk vidí jako první: pořadí.
Crate nesl osmdesát komparátorů, napsaných vedle vykreslovačů, které je potřebovaly. Většina byly neškodné duplikáty „řadit podle id“. Některé ne:
- Stejná třída nálezů byla řazena od nejhoršího v
whyaproducta od nejlepšího vweb::validate, protože oba enumySeveritybyly deklarovány opačným směrem. Identický záměr musel být zapsán jako opačný kód, takže čtenář sladící oba komparátory by obrátil jeden report, aniž by se dotkl testu. - Stejný dokument měření byl na webu řazen podle
p50a na příkazové řádce podlep95bez rozhodčího kritéria. - Tabulka rout Cockpitu byla řazena podle vykresleného HTML vlastních řádků, takže každý název CSS třídy se stal součástí řazení.
- Výpis HTTP tras se řadil podle
Value::to_string()— JSON kódování cesty, včetně uvozovek — a neměl rozhodující kritérium podle metody. - Právě jeden komparátor v crate skládal velikost písmen, v navigaci Cockpitu; každý jiný povrch vedle něj porovnával surové bajty. Nikde nic neporovnávalo řady číslic podle hodnoty, takže první pravidlo
.v10nebo čtyřciferné ADR by se v indexu, grafu, Cockpitu, na webu i ve všech generovaných dokumentech seřadilo najednou špatně.
Nic z toho nebyl nedeterminismus v obvyklém smyslu a stojí za zaznamenání, že obvyklí podezřelí chyběli: objevování je jednovláknové, jeho enumerátory třídí před vrácením, index je řazen podle URI a jeho pořadí je součástí publikovaného otisku, registr je BTreeMap a crate drží právě jeden HashMap — cache exekutoru, kterou nic nepromítá. Dva běhy na jednom stroji se shodly. Vadou bylo, že šest povrchů se shodlo na faktech a neshodlo na pořadí, což člověk čte jako repozitář, který si odporuje.
Rozhodnutí
Pořadí prezentace je jedno úplné uspořádání, deklarované jednou v apps/majordomus-cli/src/order.rs, a každý povrch vykresluje posloupnost, kterou dostane.
Typ implementuje Ordered a odpovídá OrderKey o čtyřech částech, od nejvýznamnější:
- group — sémantický koš, porovnávaný přirozeně; žádná skupina se řadí za každou skupinu, takže nezařazený ocas je čitelný a nezařazená hlava nemůže skrýt skupiny.
- rank — explicitní pozice uvnitř skupiny pro kolekce, jejichž doména ji má.
weightu okamžiku, publika, oblasti nebo funkce je takový rank. Výchozí je nezařazeno, takže kolekce bez takové sémantiky ho nikdy nezmiňuje. - label — co člověk čte, porovnáváno přirozeně: číslice podle hodnoty, ASCII velikost písmen složena, takže
Alphaaalphazůstanou vedle sebe. - identita — kanonické id a důvod, proč je pořadí úplné, a ne jen úhledné.
Čtvrtá část je rozhodnutí, ne detail. Bez ní si dvě položky se stejným labelem vyměňují místa, kdykoli se přidá nesouvisející položka, použije se jiný iterátor nebo jiný stroj vyjmenovává jinak — a komparátor, který nechává shody nerozhodnuté, je přesně to, co způsobí, že pořadí vypadá jako závod, když žádný není.
Pořadí vynucuje project.canonical-order a kontrola scripts/ci/order-check: tři absolutní kontroly (žádný komparátor s odstraněním velikosti písmen mimo order.rs, žádný třídicí klíč, který vykresluje značkování, žádné .localeCompare( ve generovaném nebo servírovaném povrchu) a jeden ratchet nad dluhem, který předchází pravidlu, v .ai/repo/order-baseline.txt, který smí klesat a nesmí růst.
Žádné nové podstatné jméno. project.no-new-nouns je blokující a docs/CONCEPTS.md je slovník; pořadí je vlastnost projekce, ne věc, kterou nástroj nově má. order.rs nejmenuje žádný pojem, který by se worker musel učit, aby nástroj používal.
Zamítnuté alternativy
Komparátor na kolekci, posuzovaný, ne vlastněný. To, co strom měl. Je to nejlevnější věc k napsání a nejdražší k usmíření: dva převrácené enumy Severity jsou důkaz, protože každý byl lokálně správný a dvojice byla pastí pro každého, kdo si jí všiml.
Řazení u konzumentů — JavaScript Cockpitu, šablony webu, generované indexy. Posouvá pořadí nejdál od dat a duplikuje ho na každém povrchu, což je tvar, který project.interfaces-are-projections už odmítá pro jména, trasy a schémata. Konzument může stále nabídnout řazení, o které se člověk výslovně požádal; to je něco jiného a zůstává.
Deklarované pořadí na kolekci, v datech — pole order: na všem. Zamítnuto jako výchozí. Činí každé přidání úpravou na dvou místech a kóduje dnešní vizuální posloupnost jako fakt o doméně. Explicitní pořadí se ponechává jen tam, kde ho doména už měla a už deklarovala: weight a order kontextového dokumentu.
Závislost pro přirozené řazení. Komparátor má třicet řádků, seznam závislostí crate se obhajuje řádek po řádku a obecné třídění Unicode by odpovídalo na otázku, kterou tento repozitář neklade.
Opravit jen povrchy, které vypadaly špatně. Postranní panel, který to spustil, šlo seřadit na místě a dříve se tak stalo. Tak se repozitář dostal k osmdesáti názorům: každý byl malou lokální opravou viditelného příznaku.
Důsledky
- Řazení je nyní projekce s vlastníkem a nová kolekce se k ní připojí implementací jednoho traitu, ne tím, že si ji každý konzument pamatuje.
- Oba enumy
Severityjsou deklarovány ve stejném směru, takže „nejhorší první“ jeb.cmp(a)všude, kde se objeví, a past sesouhlasení zmizela. Schéma závažnosti nálezu topologie mění pořadí variant; nic je nečte pozičně. - Tabulka tras Cockpitu a výpis HTTP tras mění viditelné pořadí, z metoda-pak-cesta na cesta-pak-metoda: tabulka tras se čte podle cesty a ani jedno pořadí nikdy nebylo tvrzeno.
.ai/repo/order-baseline.txtzaznamenává dluh jako dvě čísla místo slibu. Crate stále obsahuje místa řazení, která by mohla být kanonickým pořadím a zatím nejsou, a shell stále obsahujesortvolání, která řadí podle locale. Obě čísla smějí jen klesat.- První čtyřmístné ADR a první pravidlo
.v10se zařadí správně, ve všech površích najednou, protože existuje jedno místo, které rozhoduje.