138. Train pull requestů je typovaný objekt, který lze vidět
Kontext
Pull requesty v tomto repozitáři jsou často naskládané: změna se rozdělí na články, každý stojí na tom pod ním, a vlak přistává odspodu nahoru. Executor hrany už zná. Klasifikátor čte každý řádek Stacked on #N a Depends on #N a každou základní větev, která je headem jiného otevřeného pull requestu, do potvrzených závislostí a uvádí důvody jako stacked_on:#807 a depends_on:#883. Executor také připravuje další head každého článku před jeho řadou a drží jej v lokálním refu refs/prep/<n>, a pushne jej, až když článek přijde na řadu.
Nic z toho netvořilo objekt, který by si kdokoli mohl přečíst. Které pull requesty tvoří vlak, který článek přistane příště, které připravené heady jsou stále nepushnuté a o kolik je každý článek za masterem, bylo známo jen ze zpráv relací a z lokálních refů, které žádná jiná relace neviděla. Za jeden večer se dvě relace navzájem ptaly na pořadí týchž jedenácti článků. prs status ukazuje jeden pull request naráz, seřazený frontou, a pořadí fronty není pořadí vlaku: horní článek se řadí před dolní článek, na který čeká, kdykoli je méně rizikový.
Vlastník dne 2026-10-11 požádal o interaktivní, podrobnou vizualizaci trainu ve stylu Neo4j Browseru.
Rozhodnutí
-
Vlak se odvozuje, nikdy nedeklaruje.
crate::integration::trainpočítá vlaky ze tří věcí, které checkout už má: fronty (queue_of, ze zaznamenaného pozorování), těl a kontrol v tomto pozorování a refůrefs/prep/. Vlak je souvislá komponenta otevřených pull requestů podle jejich potvrzených vzájemných závislostí, spolu s každým otevřeným pull requestem, který vůbec deklaruje závislost. Článek, jehož nižší články už přistály, je stále zbytkem svého vlaku, přičemž tyto pull requesty jsou pod ním. Odvozené závislosti (head, který jen obsahuje jiný) jsou důkaz a nic nespojují, jako v klasifikátoru. -
Pořadí je pořadím vlaku, ne fronty. Články se řadí topologickým řazením, nižší články první, shody se rozhodují pořadím ve frontě. Články zachycené v cyklu jdou nakonec a jsou označeny, cyklus se hlásí. Každý článek nese své
position, svédepthod masteru, zda jeat_turn(každá jím deklarovaná závislost přistála), na čem stojíona cocarries. Každý vlak nese svůjroots,topsanextčlánek. -
Hrana říká, jak je deklarována. Stack podle základní větve nebo řádek
Stacked onjeSTACKED_ON;Depends on,RequiresaLand afterjsouDEPENDS_ON. Hrana jesatisfied, když pull request pod ní byl mergnut. -
Připravený head se porovnává, nikdy nepřesouvá.
refs/prep/<n>se čte pomocígit for-each-ref. Připravený head článku jepushed, když je to head, který forge servíruje, apendingjinak. Připravený head, jehož pull request není článkem, se uvede jako nepřipojený. Nic v tomto modelu nefetchuje, nepushuje ani nezapisuje ref a push na řadě článku zůstává aktem executoru. -
Jedna schopnost, každý povrch.
integration.trainsje deklarováno jednou scapability!a promítnuto domajordomus prs trains(text a--format json),GET /api/v1/pull-requests/trainsa MCPmajordomus_pull_request_trains. Jako zbytek modulu je jen pro čtení a offline. -
Cockpit ho kreslí a vypisuje.
/cockpit/trainsvykresluje jednu tabulku na train, která nepotřebuje JavaScript, se stejnými fakty.share/cockpit/trains.jspřidává kresbu v Cytoscape v duchu Neo4j Browseru: master jako kotvící uzel, kulaté uzly s popiskem uvnitř, barvené podle určení z deklarovaných rolí stavu a tónu (nikdy barevným literálem), popsané orientované vztahy, silové nebo vrstvené rozvržení, tažení, zoom, posun, rozsvícení sousedů uzlu pod ukazatelem, panel vlastností, filtry podle trainu a určení, hledání a navigace klávesnicí. Pohyb se řídíprefers-reduced-motion. Stejnou trasu HTTP dotazuje jednou za minutu, dokud je karta viditelná, a ukazuje, kdy se naposledy ptala. Žádný stream se pro něj nevymýšlí.
Důsledky
- Co je vlak, co přistane příště a které připravené heady čekají na svou řadu, může číst kterákoli relace, člověk nebo nástroj ze stejné odpovědi, aniž by to musela nést zpráva mezi relacemi.
- Kresba a tabulka se nemohou rozcházet, protože obě vykreslují odpověď jedné schopnosti a ta schopnost je tatáž hodnota, kterou vypisuje příkazová řádka (případ 1072).
- Každá odpověď znovu rozhoduje vztah každého odkazu k masteru, což na vytíženém stroji trvá vteřiny. Stránka proto dotazuje jednou za minutu a nikdy, dokud je dotaz ještě venku. Cachovaná odpověď by byla samostatné rozhodnutí.
- Slovo vztahu
carries_master(ADR 0129) se čte ze serializovaného druhu vztahu, takže model funguje na spustitelném souboru s tímto vztahem i bez něj a hlásífalse, kde není znám. - Odkaz na forge je odkaz GitHubu, protože executor pozoruje forge přes CLI GitHubu a nic jiného.
Zamítnuté alternativy
- Deklarování trains v souboru. Byl by to druhý záznam toho, co už deklarují těla a základní větve, a zastaral by ve chvíli, kdy by se odkaz přesměroval.
- Řazení trainu podle pořadí ve frontě. Pořadí odpovídá na „co je nejbezpečnější udělat dál“, ne na „co na čem stojí“. Ukázané jako pořadí trainu by dalo horní článek před článek, na který čeká.
- Proud pro stránku. Relace 1b vlastní
majordomus monitor(I2400 až I2407). Dotazování existující trasy nic nevymýšlí a degraduje na tabulku renderovanou serverem. - Rozšíření rozvržení pro Cytoscape. Cockpit vendoruje
cytoscape.min.jsa nic jiného a jeho content-security policy nejmenuje žádný vzdálený původ. Vestavěnécoseje silové rozvržení abreadthfirstz masteru dává vrstvený pohled.