I2059 — Přebuildování nikdy nenahradí spustitelný soubor, který pojmenovává živý lease
Zabránit vstupnímu bodu, aby přestavěl executable na místě pod běžícím sdíleným serverem, a zařídit, aby server navazující na vystřídaný server navázal na adresu, na které sloužil ten starý, nebo oznámil, že se to nepodařilo.
PŘIPRAVENO vlna 0 · p1 · profil implementation · bezpečné souběžně
Součást development-runtime — The runtime has a development surface.
Připraveno. Všechny závislosti jsou hotové, takže majordomus plan start I2059 bude přijato.
Cíl
Zabránit vstupnímu bodu, aby přestavěl executable na místě pod běžícím sdíleným serverem, a zařídit, aby server navazující na vystřídaný server navázal na adresu, na které sloužil ten starý, nebo oznámil, že se to nepodařilo.
Proč
bin/majordomus-cli znovu sestaví apps/majordomus-cli/target/debug/majordomus, kdykoli se zdroje změnily. V primárním checkoutu je tento soubor tím, ze kterého byl sdílený server spuštěn, a od #747 nahrazený spustitelný soubor zruší platnost lease. Dne 2026-10-08 server, který vlastník nařídil spustit na všech rozhraních (0.0.0.0:57547, spuštěn 2026-10-07T18:49Z), ztratil lease v 08:06:32Z: .ai/local/state/mcp/server.log zaznamenává 'superseded lease: the server was started from ... target/debug/majordomus and that file has been replaced since', a to po diagnostickém buildu v primárním checkoutu. Integrátor hlásil totéž po každém spuštění `prs refresh`, `plan` a `drain` z primárního checkoutu po fast-forwardu. Nástupce spustil launcher, jehož prostředí neneslo MAJORDOMUS_HTTP_HOST, takže se navázal na loopback na jiném portu; nové relace dostaly od starého serveru odpověď 409 lease_lost a nikdo nebyl informován, že se adresa změnila. #747 učinil důsledek viditelným. Příčinu neodstranil.
Aktuální stav
Build v checkoutu s připraveným serverem nahradí soubor, který lease pojmenovává. Lease je nahrazen, další launcher spustí nástupce na výchozí adrese a adresa, na které starý server obsluhoval, se nepřenáší ani nezmiňuje.
Cílový stav
Build v checkoutu nechá jeho připravený server připravený na téže adrese, dokud ho něco záměrně nerestartuje: build zapisuje vedle zapůjčeného programu a restart ho vymění, nebo server běží z kopie. Když je server nahrazen, jeho nástupce obsluhuje adresu, kterou starý publikoval, nebo se nahrazení hlásí s oběma adresami na každém povrchu, který hlásí stav serveru.
Rozsah
- bin/majordomus-cli
- lib/rust_bin.sh
- apps/majordomus-cli/src/lease.rs
- apps/majordomus-cli/src/commands/serve.rs
- docs/MCP.md
- test/cases
Závislosti
Žádné. Tento úkol je kořenem grafu.
Kritéria přijetí
- Sestavení spuštěné v checkoutu, jehož server je připraven, zanechá `serve status` hlásící tento server jako připravený na adrese, kterou měl před sestavením
- Nástupce spuštěný po nahrazení se naváže na hostitele a port, které publikoval nahrazený lease, nebo `serve status` jmenuje obě adresy a proč se liší
- Server navázaný přes MAJORDOMUS_HTTP_HOST nebo --host není nahrazen loopback serverem, aniž by to server.log uvedl na řádku
Validace
- bin/majordomus plan validate
- MJ_TEST_JOBS=4 bash test/run.sh <the case this issue adds>
Požadované důkazy
- rebuild_keeps_server_ready_case
- successor_address_case
Důkazy
Nic nezaznamenáno. Za každým tokenem výše musí stát příkaz nebo artefakt, než lze tento úkol dokončit; vyprávění se odmítá.
Časová osa
- zahájeno
- —
- ověřeno
- —
- dokončeno
- —
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/I2059.yaml. Přečtěte ho zpět pomocí majordomus plan show I2059.