Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

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ě

Součást test-evidence — Každé ověřitelné tvrzení a widget se na každém povrchu převádí na testovací důkaz vázaný na revizi.

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átypcommandvýsledeku commitu
record_reopened_once_under_the_lease_casetestMJ_TEST_JOBS=2 bash test/run.sh 1036_the_executor_reopens_a_record_pull_requesttesty: 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_teststestcargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --test integration_record_reopentest 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.

Prohledává názvy a popisy všech stránek, které tento web publikuje.