I2298 — Pull request postavený na jiném, který už přistál, se slučuje podle verdiktu, který jeho hlava už má
Dát frontě integrace typovaný vztah pro head, kterému chybějí commity masteru a jehož merge zapisuje vlastní strom, aby odkazy vrstvené řady přistály jeden po druhém v jediném běhu povinné kontroly, a zaznamenat řadu jako rozhodnutí.
HOTOVO vlna 0 · p1 · profil implementation · bezpečné souběžně
Cíl
Dát frontě integrace typovaný vztah pro head, kterému chybějí commity masteru a jehož merge zapisuje vlastní strom, aby odkazy vrstvené řady přistály jeden po druhém v jediném běhu povinné kontroly, a zaznamenat řadu jako rozhodnutí.
Proč
Pipeline obnovy je záměrně jedna hluboká (docs/INTEGRATION.md, 'One merge at a time'): propustnost je jeden pull request na běh povinné kontroly. Změřeno 2026-10-10: validate běh pull requestu je 398 minut úloh a 85 až 100 minut reálného času, určeného nejpomalejším shardem sady; stopa tohoto checkoutu drží 15 ověřených mergí za čtyři dny proti 52 otevřeným pull requestům, z nichž 23 je `needs_refresh`. Vlastník 2026-10-10 schválil naskládaný train a jedna relace ho řídí ručně: každý head se aktualizuje na připravený head předchozího. Když ten spodní přistane, horní head neobsahuje merge commit masteru, takže ho fronta označí jako `behind` a chce obnovu: merge masteru, který nemění žádný soubor, nový head a druhý běh o 398 minutách úloh pro strom, který první běh už posoudil. Jediná cesta executoru kolem toho byla zeptat se vlastníka, než ručně projde kontrolou aktuálnosti.
Aktuální stav
RelationToMaster má `up_to_date` (hlava obsahuje master) a `behind` (neobsahuje a merge je čistý). Kontrola aktuálnosti propustí jen `up_to_date`. Hlava postavená na přistálém pull requestu je `behind`, ať by její merge zapsal cokoli. Cache vztahů drží položku navždy pod dvojicí id commitů, bez záznamu, který slovník o ní rozhodl.
Cílový stav
Head, jehož čistý merge do masteru zapíše vlastní strom headu a kterému chybí jen merge commity masteru, je `carries_master`. Kontrola čerstvosti jej propustí, připravený říká `carries_master`, `prs repair` na něm nemá co opravovat a executor jej sloučí bez obnovy mezi tím. Jedna změna na masteru, kterou head nikdy neviděl, ať autorská nebo odvozená, nebo jeden vlastní commit masteru, který není merge, a je `behind`: changelog se skládá z historie. Cache vztahů zahazuje vztahy rozhodnuté podle jiného slovníku. ADR 0129 zaznamenává vlak: co je článek, co články řadí, co stojí červený článek a co je ponecháno pozdějšímu úkolu (executor sestavující vlak sám, do deklarované hloubky).
Rozsah
- apps/majordomus-cli/src/integration/model.rs
- apps/majordomus-cli/src/integration/relation.rs
- apps/majordomus-cli/src/integration/classify.rs
- apps/majordomus-cli/src/integration/drain.rs
- apps/majordomus-cli/src/integration/repair.rs
- apps/majordomus-cli/src/integration/mod.rs
- apps/majordomus-cli/src/integration/tests.rs
- apps/majordomus-cli/src/commands/prs.rs
- docs/INTEGRATION.md
- .ai/repo/adrs/0129-a-train-of-pull-requests-lands-in-one-run-of-the-required-check.md
- .ai/repo/project/issues/I2298.yaml
- test/cases/1040_a_stacked_head_lands_on_the_verdict_it_has.sh
- test/cases/850_integration_drains_cycle_by_cycle.sh
- docs/generated
- site/content
- site/data
Mimo rozsah
- Exekutor, který sám obnovuje pull request na hlavu jiného, a hloubka pipeline v .ai/repo/ci/queue.yaml: pozdější úkol, pojmenovaný v ADR 0129.
- Vlastní push masteru spouští běh po každém merge: 521 minut jobů za strom, který už posoudil běh pull requestu. Zde nerozhodnuto.
- Které pull requesty se dají na vlak a v jakém pořadí: plán executoru.
Závislosti
Žádné. Tento úkol je kořenem grafu.
Kritéria přijetí
- `relation_to_master` odpoví `carries_master` pro head postavený na jiném headu, jakmile ten přistál jako merge commit, a `behind` pro tentýž head, jakmile master drží jednu další změnu, autorskou či odvozenou, nebo jeden další commit, který není merge; dokázáno na skutečném repozitáři
- Head `carries_master` s prošlými požadovanými kontrolami je `ready`, projde každou kontrolou a uvede důvody `carries_master`, `required_checks_passed`
- `prs drain` sloučí dva naskládané pull requesty ve dvou krocích bez obnovení mezi nimi, přes příkazovou řádku proti skriptovanému forge, a master, který zanechá, má strom druhého head
- Relace uložená do cache pod jiným slovníkem se gitu zeptá znovu
- `prs explain` jmenuje každý vztah jeho vlastním slovem; dříve vypisoval `unknown` pro každý vztah kromě `behind` a `conflicting`
- docs/INTEGRATION.md jmenuje vztah, kontrolu a train a ADR 0129 je navrženo
Validace
- cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --lib integration::
- bash test/run.sh 1040_a_stacked_head_lands_on_the_verdict_it_has
- MJ_TEST_JOBS=3 bash test/run.sh 720_integration_follows_the_current_master 850_integration_drains_cycle_by_cycle 911_repair_decides_and_moves_nothing
- bin/majordomus plan validate
Požadované důkazy
- stacked_head_carries_master_case
- decision_recorded
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| stacked_head_carries_master_case | test | MJ_TEST_JOBS=2 bash test/run.sh 1040_a_stacked_head_lands_on_the_verdict_it_has | testy: 1 prošel, 0 selhalo, 0 přeskočeno (běh 2026-10-14 mezi 07:40Z a 07:58Z na masteru ce5959db59) | ce5959d |
| decision_recorded | artifact | ADR 0129, stav proposed, na masteru ce5959db59 | ce5959d |
Časová osa
- zahájeno
- 2026-10-14T08:00:13Z
- ověřeno
- —
- dokončeno
- 2026-10-14T08:00:21Z
Tato tři pole, důkazy výše a stav závislostí jsou vše, z čeho se stav skládá. Neexistuje žádné pole stavu, které by s nimi mohlo být v rozporu.
Kanonický záznam: .ai/repo/project/issues/I2298.yaml. Přečtěte ho zpět pomocí majordomus plan show I2298.