I2398 — Derive přesunutý na jiný stroj čeká na řadu v deklarované frontě
Udělat z derive offload schopnost spustitelného souboru: hostitelé a jejich limity deklarované jednou pod .ai/repo, hostitel vybraný podle volného disku a délky fronty, fronta FIFO na hostiteli, v níž lístek mrtvého čekatele nikoho neblokuje, vlastní adresář buildu pro každý derive a okružní cesta bundle-in/bundle-back s jejími odmítnutími, testovaná bez sítě a zdokumentovaná.
HOTOVO vlna 0 · p1 · profil implementation · bezpečné souběžně
Součást development-runtime — The runtime has a development surface.
Cíl
Udělat z derive offload schopnost spustitelného souboru: hostitelé a jejich limity deklarované jednou pod .ai/repo, hostitel vybraný podle volného disku a délky fronty, fronta FIFO na hostiteli, v níž lístek mrtvého čekatele nikoho neblokuje, vlastní adresář buildu pro každý derive a okružní cesta bundle-in/bundle-back s jejími odmítnutími, testovaná bez sítě a zdokumentovaná.
Proč
Každá relace odvozuje svou větev na jiném stroji pomocí ~/dev/.derive-offload.sh, skriptu mimo repozitář, který nic netestuje ani nerecenzuje. Změřeno 2026-10-11 00:18Z na lundra: jeden derive běží najednou 11 až 13 minut a pět čekalo, nejstarší 2 h 12 min, protože zámek hostitele byl `until mkdir; do sleep 15`: závod, ve kterém může poslední příchozí vyhrát pokaždé, ne fronta. Verze v2 napsaná té noci přidává volbu hostitele, FIFO frontu ticketů a minimum volného disku, ale je to opět soubor v domovském adresáři s hostiteli v něm vypsanými. V 00:25Z na druhém MacBooku derive spuštěný kolem zámku znovu postavil sdílený build adresář pod běžícím offloadovaným derive a stage C odmítla s `this executable is not of this tree's generation`.
Aktuální stav
Offload je ~/dev/.derive-offload.sh (v1, souběh mkdir) a ~/dev/.derive-offload-v2.sh (v2, FIFO lístky, volba hostitele, soukromý adresář sestavení). Oba nesou ve zdrojovém kódu dvě adresy hostitelů a minimum 10 GiB. Nic v repozitáři nedeklaruje hostitele, netestuje frontu ani nedokumentuje cestu tam a zpět.
Cílový stav
`majordomus offload derive <worktree>` dělá to, co v2, s hosty a limity čtenými z .ai/repo/offload/derive.yaml (druh derive-offload, schéma derive-offload/v1). `offload hosts` vypíše deklaraci a `offload probe` změří každého hosta a jmenuje toho, kterého by derive vzal. Fronta se rozhoduje v Rustu nad pozorováními hosta: dva čekající se obsluhují v pořadí příchodu, lístek mrtvého čekajícího se odstraní, zámek, jehož držitelé jsou všichni mrtví, se nahlas převezme a na zámek bez souboru držitele (čekajícího z v1 nebo v2) se čeká. Každý derive se staví ve vlastním copy-on-write klonu sdíleného build adresáře, který se na konci odstraní. Jeho cesty fronty a názvy lístků jsou z v2, takže oba druhy čekajících se navzájem vidí, zatímco relace přecházejí.
Rozsah
- .ai/repo/offload/derive.yaml
- .ai/repo/offload/README.md
- share/schemas/majordomus/derive-offload/derive-offload.v1.schema.json
- share/kinds.yaml
- .ai/repo/knowledge/sources.yaml
- apps/majordomus-cli/src/offload/mod.rs
- apps/majordomus-cli/src/offload/declaration.rs
- apps/majordomus-cli/src/offload/queue.rs
- apps/majordomus-cli/src/offload/host.rs
- apps/majordomus-cli/src/offload/remote.rs
- apps/majordomus-cli/src/offload/run.rs
- apps/majordomus-cli/src/commands/offload.rs
- apps/majordomus-cli/src/cli.rs
- apps/majordomus-cli/tests/offload.rs
- .ai/repo/rules/project/a-derive-offload-waits-its-turn.v1.md
- docs/OFFLOAD.md
- .ai/repo/project/issues/I2398.yaml
- docs/generated
- site/content
- site/data
Mimo rozsah
- Vyřazení ~/dev/.derive-offload.sh a ~/dev/.derive-offload-v2.sh: jsou mimo repozitář a instance běží; relace přecházejí tím, že místo toho volají příkaz.
- Instalace spustitelného souboru na hostitele nebo provoz hubu tam: hostitel potřebuje git, checkout tohoto repozitáře a toolchain, kterým se scripts/derive sestavuje, nic z této změny.
- Udržování sdíleného adresáře buildu v teple ze soukromého adresáře dokončeného derive: v2 ne, a vyměnit jej pod builderem, který ignoruje zámek, je přesně to selhání, které tento úkol odstraňuje.
Závislosti
Žádné. Tento úkol je kořenem grafu.
Kritéria přijetí
- Hostitelé, jejich soubory identit ssh, minimum volného disku, cesty front a vzdálené rozložení se čtou z .ai/repo/offload/derive.yaml a validují proti derive-offload/v1; žádná adresa hostitele není zapsána v crate ani ve skriptu
- Dva čekající jsou obslouženi v pořadí příchodu a tiket, jehož čekající je mrtvý, se odstraní a nezablokuje další; doloženo proti skutečnému adresáři hostitele se skutečnými procesy
- Host pod svým minimem volného disku nebo ten, který neodpovídá, se přeskočí a zvolí se host s nejméně běžícími nebo čekajícími derivacemi, shody rozhoduje pořadí deklarace
- Derive přesunutý přes lokální náhradu ssh se vrátí staged a necommitnutý; probíhající merge cestuje s oběma rodiči; nesledované soubory, nevyřešený merge a derive, který smaže sledovaný soubor, jsou každý odmítnuty
- Adresář buildu derive je jeho vlastní: build do sdíleného adresáře za běhu derive nenahradí spustitelný soubor, kterým se odvozuje
- docs/OFFLOAD.md dokumentuje příkaz, deklaraci, frontu a etiketu nástěnky a mesh a pravidlo project.a-derive-offload-waits-its-turn jmenuje testy
Validace
- cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --lib offload::
- cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --test offload
- bin/majordomus plan validate
Požadované důkazy
- offload_queue_fairness_test
- offload_round_trip_test
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| offload_queue_fairness_test | test | cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --lib offload::queue | test result: ok. 16 passed; 0 failed (run 2026-10-14 between 07:40Z and 07:58Z on master ce5959db59) | ce5959d |
| offload_round_trip_test | test | cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --test offload a_derive_comes_back_staged_and_uncommitted | test result: ok. 1 passed; 0 failed (run 2026-10-14 between 07:40Z and 07:58Z on master ce5959db59) | ce5959d |
Časová osa
- zahájeno
- 2026-10-14T07:59:13Z
- ověřeno
- —
- dokončeno
- 2026-10-14T07:59:22Z
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/I2398.yaml. Přečtěte jej zpět pomocí majordomus plan show I2398.