I2296 — Executor znovu otevře pull request se záznamem, pro který nebyl spuštěn žádný běh
Nechat `majordomus prs drain` samo zavřít a znovu otevřít pull request se záznamem release, když ho otevřel token workflow, a proto nemá vlastní kontrolu, takže se záznam přistane o jeden cyklus validate po publikaci, aniž si toho někdo všimne.
HOTOVO vlna 0 · p1 · profil implementation · bezpečné souběžně
Cíl
Nechat `majordomus prs drain` samo zavřít a znovu otevřít pull request se záznamem release, když ho otevřel token workflow, a proto nemá vlastní kontrolu, takže se záznam přistane o jeden cyklus validate po publikaci, aniž si toho někdo všimne.
Proč
Release navrhne svůj záznam jako `release/record-<tag>` pomocí GITHUB_TOKEN a GitHub nespustí žádné workflow z události, kterou tento token způsobil: vlastní běh pull requestu skončí failure bez jediného jobu a jeho povinné `ci` se nikdy nenahlásí. Dokud záznam není na masteru, release-check selhává v `structure` na každém otevřeném headu (vlastník tuto kontrolu 2026-10-10 ponechal přísnou). U v0.19.0 to okno trvalo 3 hodiny (#861, admin-merge po 1,7 h); u v0.19.1 5,7 hodiny (#866): vyslaná validate prošla na headu, ochrana větve přesto merge odmítla a člověk pull request zavřel a znovu otevřel 3,4 hodiny po jeho navržení, čímž se spustil běh, který merge umožnil. Dispatch nekoupil nic než devadesát minut. I2282 tuto vadu zaznamenává; tento úkol z ní odstraňuje člověka.
Aktuální stav
Exekutor klasifikuje pull request se záznamem s prázdným rollupem jako waiting_for_checks s required_checks:missing a čeká na kontrolu, kterou nikdo nikdy nenahlásí. Člověk si toho musí všimnout, uzavřít ho a znovu otevřít. Nic v exekutoru nic nezavírá a neotevírá.
Cílový stav
Když není nic připraveno ke sloučení, pull request z větve `release/record-`, který čeká na chybějící povinnou kontrolu, se na forge prověří: je-li otevřený na rozhodnuté hlavě, otevřel ho token workflow, je starší než dvouminutová odklad a nemá jedinou vlastní kontrolu, executor ho uzavře s komentářem, proč, a ihned znovu otevře. Dělá to jednou na hlavu, pod zámkem integrace, s `reopen_attempted` ve stopě před dotazem na forge a `reopened` nebo `reopen_failed` po něm, a `--dry-run` ho jen pojmenuje. Záznam otevřený člověkem, záznam, který už má vlastní běh, záznam ještě v odkladu i všechny ostatní větve zůstanou nedotčeny. Znovuotevření, které po uzavření selže, řekne, že pull request zůstal uzavřený, a uvede příkaz, který člověk spustí. Ponecháno vlastníkovi, protože mění release pipeline a případ 996: dispatch validate v `.github/workflows/release.yml` je nadbytečný, jakmile executor záznam znovu otevírá (oba běhy pak validují stejnou hlavu), a zůstává, dokud ho vlastník neodstraní.
Rozsah
- apps/majordomus-cli/src/integration/drain.rs
- apps/majordomus-cli/src/integration/tests.rs
- apps/majordomus-cli/src/commands/prs.rs
- apps/majordomus-cli/tests/integration_record_reopen.rs
- test/cases/1036_the_executor_reopens_a_record_pull_request.sh
- docs/INTEGRATION.md
- docs/DISTRIBUTION.md
Závislosti
Žádné. Tento úkol je kořenem grafu.
Kritéria přijetí
- `prs drain` proti skriptovanému forge uzavře a znovu otevře pull request `release/record-<tag>`, který otevřel token workflow, starší než odklad a s prázdným rollupem, a stopa drží `reopen_attempted` před `reopened`, mezi `lease_acquired` a `lease_released`
- `prs drain --dry-run` jmenuje znovuotevření a dosáhne forge bez uzavření a bez znovuotevření
- Stejný head se neotevírá dvakrát, ačkoli se čte jako required_checks:missing, dokud jeho běh nenahlásí výsledek
- Záznam, který otevřel člověk, záznam s vlastní kontrolou, záznam v odkladné lhůtě, záznam, který forge nemůže ukázat, a větev, která není záznamem, se neuzavírají ani znovu neotevírají
- Znovuotevření, které forge odmítne, je `reopen_failed` ve stopě se svou třídou, skončí s 10 a říká, zda pull request zůstal uzavřený
- Když stopa nemůže zaznamenat `reopen_attempted`, nic nedosáhne forge
- docs/INTEGRATION.md jmenuje úkon a jeho tři slova stopy a docs/DISTRIBUTION.md říká, kdo záznam znovu otevírá
Validace
- bin/majordomus plan validate
- MJ_TEST_JOBS=4 bash test/run.sh 1036_the_executor_reopens_a_record_pull_request
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test integration_record_reopen
Požadované důkazy
- record_reopened_once_under_the_lease_case
- reopen_trail_first_unit_tests
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| record_reopened_once_under_the_lease_case | test | MJ_TEST_JOBS=2 bash test/run.sh 1036_the_executor_reopens_a_record_pull_request | 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 |
| reopen_trail_first_unit_tests | test | cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --test integration_record_reopen | test result: ok. 3 passed; 0 failed (run 2026-10-14 between 07:40Z and 07:58Z on master ce5959db59) | ce5959d |
Časová osa
- zahájeno
- 2026-10-14T08:00:01Z
- ověřeno
- —
- dokončeno
- 2026-10-14T08:00:09Z
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/I2296.yaml. Přečtěte ho zpět pomocí majordomus plan show I2296.