I2827 — Nástroj napsaný před okamžikem se spustí, až ho jeho zapisovatel pustí
Dát crate jednoho pomocníka, který spustí program a, dokud je soubor programu ještě někde otevřen pro zápis (ETXTBSY), krátce počká a zkusí to znovu v rámci meze; použít ho na místech spouštění, jejichž testy zapíšou náhradní nástroj a hned ho spustí.
HOTOVO vlna 0 · p1 · profil implementation · bezpečné souběžně
Cíl
Dát crate jednoho pomocníka, který spustí program a, dokud je soubor programu ještě někde otevřen pro zápis (ETXTBSY), krátce počká a zkusí to znovu v rámci meze; použít ho na místech spouštění, jejichž testy zapíšou náhradní nástroj a hned ho spustí.
Proč
CI běh 39049547899, job rust (2), selhal deploy::observed::tests::the_forge_is_asked_through_its_own_tool_and_every_refusal_is_said v apps/majordomus-cli/src/deploy/observed.rs:514 s hláškou 'the GitHub CLI (.../fake-gh) could not run: Text file busy (os error 26)'. Test zapíše spustitelnou náhradu a spustí ji; jiné vlákno testu vytvořilo potomka (fork), zatímco byl deskriptor pro zápis otevřený, potomek jej drží až do exec a Linux odmítá spustit soubor otevřený pro zápis. Zapsat kopii a přejmenovat ji nepomůže (zděděný deskriptor drží inode); pomůže čekání. Stejné čekání existovalo jen na straně testu nebo přímo v kódu (capability/builtin/health.rs, worktree/direnv.rs).
Aktuální stav
Produktové spuštění čerstvě zapsané náhrady okamžitě selže na ETXTBSY a selhání se hlásí jako selhání nástroje, čímž zčervená nesouvisející job CI. Tento úkol pokrývá volání GitHub CLI v deploy::observed a monitor::github; dalších pět míst spouštění, jejichž testy zapisují náhradu a spouštějí ji, se odkládá až po v1.0.0-alpha.1 (uvedeno pod non_scope).
Cílový stav
apps/majordomus-cli/src/process.rs obsahuje retrying_busy, který se zeptá znovu 50krát s odstupem 100 ms, dokud start selhává s ExecutableFileBusy, a vrátí poslední odpověď; deploy::observed::run (volání GitHub CLI, kterého dosahuje i obnova forge ve schopnosti served) a monitor::github::run startují gh přes něj.
Rozsah
- apps/majordomus-cli/src/process.rs
- apps/majordomus-cli/src/lib.rs
- apps/majordomus-cli/src/deploy/observed.rs
- apps/majordomus-cli/src/monitor/github.rs
Mimo rozsah
- Odloženo až po v1.0.0-alpha.1: spawny v apps/majordomus-cli/src/delivery/public.rs:279 (run_pages), apps/majordomus-cli/src/offload/remote.rs:139, :160 a :175 (Remote::run, run_to_file, spawn), apps/majordomus-cli/src/economics/runner.rs:644 (harness_version) a :370 (spawn_group) a apps/majordomus-cli/src/episodes.rs:358 (nástroj hooku), z nichž každý test dosahuje zástupcem, který právě napsal
- Místa spouštění procesů dosažená jen integračními testy přes samostatný proces majordomus
- Hooky, které spouští git (náhrady pre-receive z kontinuity) a které žádný spawn Majordoma nestartuje
Závislosti
Žádné. Tento úkol je kořenem grafu.
Kritéria přijetí
- Na Linuxu je program držený tímto procesem otevřený pro zápis odmítnut s ExecutableFileBusy a retrying_busy ho spustí, jakmile zapisovatel uvolní
- Program, který nelze spustit z jiného důvodu, dostane odpověď hned, s tímto důvodem
- deploy::observed::run a monitor::github::run spouštějí CLI GitHubu přes retrying_busy
Validace
- bin/majordomus plan validate
- cargo test --lib -- process:: deploy::observed:: monitor::github:: capability::builtin::served::
Požadované důkazy
- etxtbsy_retry_test
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| etxtbsy_retry_test | ci | validate run 39438896504 at master 9a5a9b77520: rust (1-3) jobs 118683336143 118683336062 118683336401 run cargo test, incl. process::tests::a_busy_start_is_asked_again_until_it_answers_or_the_bound_is_spent (8a82388e0af) | success (the run's only red job is pages, which runs no test) | 573df96 |
Časová osa
- zahájeno
- 2026-10-20T22:03:47Z
- ověřeno
- 2026-10-20T22:04:26Z
- dokončeno
- 2026-10-20T22:05:30Z
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/I2827.yaml. Přečtěte ho zpět pomocí majordomus plan show I2827.