I2491 — Osobní vrstva nemění nic sdíleného: init --personal a install.sh --personal drží vrstvu jako vlastní jedné osoby, ověří ji a --shared ji předá týmu
Umožnit jednomu člověku používat nástroj na skutečné práci v repozitáři, který sdílejí další lidé, aniž by cokoli sdíleného změnil: jeden přepínač u init a u instalátoru, každý pozdější zapisovatel pokrytý stejným mechanismem, výsledek ověřený při instalaci i při každém doctor, spustitelný soubor čtoucí nesledovanou vrstvu, aniž by mu to někdo řekl, a jeden příkaz, který vrstvu předá týmu.
HOTOVO vlna 0 · p1 · profil implementation · bezpečné souběžně
Cíl
Umožnit jednomu člověku používat nástroj na skutečné práci v repozitáři, který sdílejí další lidé, aniž by cokoli sdíleného změnil: jeden přepínač u init a u instalátoru, každý pozdější zapisovatel pokrytý stejným mechanismem, výsledek ověřený při instalaci i při každém doctor, spustitelný soubor čtoucí nesledovanou vrstvu, aniž by mu to někdo řekl, a jeden příkaz, který vrstvu předá týmu.
Proč
ADR 0145. Běžný init zapisuje sledovaný .gitignore (lib/init.sh, mj_init_gitignore), update zapisuje AGENTS.md, CLAUDE.md a GEMINI.md v kořeni (lib/update.sh), capture install zapisuje .claude/ (lib/capture.sh) a doctor selhává, dokud README.md nejmenuje AGENTS.md (lib/doctor.sh, mj_validate_bootstrap). Žádný produktový kód nezapisoval .git/info/exclude. Rust executable vyjmenovává jen sledované soubory (apps/majordomus-cli/src/discovery/mod.rs), takže nesledovaná vrstva byla prázdná, pokud nebylo předáno --discovery filesystem, a žádný launcher, hook ani konfigurace klienta ho nepředává. Případ 86 držel ručně psaný seznam přepínačů instalátoru, takže nový přepínač mohl zůstat nezdokumentován a projít.
Aktuální stav
Člověk, který chce vlastní vrstvu, zapíše soubor exclude ručně; update a capture install zapisují mimo něj; nic ho neověřuje; spustitelný soubor v takové vrstvě nevidí žádné pravidlo, prompt ani záznam; z osobní vrstvy do sdílené nevede žádný krok.
Cílový stav
majordomus init --personal a install.sh --personal vytvoří prostou vrstvu, zakryjí ji v info/exclude společného adresáře gitu a selžou, pokud git status po nečte stejně jako před. update a capture install zakryjí každou cestu před zápisem a sledovanou odmítnou celou. doctor ověřuje zakrytí při každém běhu. Objevování prochází pracovní strom, když manifest není sledován nikde. init --extend --shared odstraní zakrytí a nic necommituje. Případ 86 čte příznaky instalátoru z jeho parseru.
Rozsah
- lib/common.sh
- lib/init.sh
- lib/update.sh
- lib/capture.sh
- lib/doctor.sh
- share/install/install.sh.in
- share/install/INSTALL.md.in
- share/commands.yaml
- apps/majordomus-cli/src/discovery/mod.rs
- apps/majordomus-cli/src/app.rs
- apps/majordomus-cli/src/cli.rs
- test/cases/2979_a_personal_layer_changes_nothing_shared.sh
- test/cases/86_installer_platform.sh
- .ai/repo/adrs/0145-a-personal-layer-changes-nothing-shared.md
- .ai/repo/rules/project/a-personal-layer-changes-nothing-shared.v1.md
- .ai/repo/use-cases/use-the-tool-as-your-own-in-a-shared-repository.md
- .ai/repo/features/install.md
- docs/CLAIMS.yaml
- docs/claims/personal-layer-changes-nothing-shared.md
- .ai/repo/project/issues/I2491.yaml
Mimo rozsah
- Řízení přístupu nebo jakýkoli způsob, jak obejít pravidla organizace o nástrojích: vrstva leží na disku na očích
- Instalace hooků commit a push: init nenainstaluje žádný v žádném režimu
- Přenos osobní vrstvy na jiný stroj: je jednoho checkoutu a mesh je cesta napříč
Závislosti
Žádné. Tento úkol je kořenem grafu.
Kritéria přijetí
- V repozitáři s necommitnutou prací nechá init --personal git status --porcelain --untracked-files=all bajt po bajtu shodný, nezapíše žádný sledovaný soubor a skončí 10, pokud to nešlo
- update a capture instalované pod osobní vrstvou ponechávají git status totožný a update odmítne (15) cíl projekce, který git sleduje, dřív, než zapíše jakýkoli cíl
- doctor hlásí osobní vrstvu jako ověřenou, pojmenuje její soubor, který je sledován, a nenechá sledované README selhat za to, že nejmenuje AGENTS.md
- Spustitelný soubor vypíše pravidla nesledované vrstvy bez volby --discovery
- install.sh --personal výsledek ověří sám a řekne to; mimo repozitář ponechá nainstalovaný nástroj a řekne, která polovina selhala
- init --extend --shared odstraní blok, zapíše dva řádky .gitignore, vypíše cesty k commitnutí, nic necommitne a odmítne (15) vrstvu, která není osobní
- Příznak, který parser instalátoru přijímá a jeho --help neuvádí, selže v případu 86
Validace
- bin/majordomus plan validate
- MJ_TEST_JOBS=2 bash test/run.sh 2979_a_personal_layer_changes_nothing_shared 86_installer_platform 85_installer 01_init
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --doc layer_is_untracked
Požadované důkazy
- personal_install_case_2979
- derived_discovery_doctest
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| personal_install_case_2979 | test | MJ_TEST_JOBS=2 bash test/run.sh 2979_a_personal_layer_changes_nothing_shared 86_installer_platform | each: tests: 1 passed, 0 failed, 0 skipped (run 2026-10-14 before 07:36Z on master ce5959db59) | ce5959d |
| derived_discovery_doctest | test | cargo test --manifest-path apps/majordomus-cli/Cargo.toml --doc layer_is_untracked | test result: ok. 1 passed; 0 failed (běh 2026-10-14 před 07:36Z na masteru ce5959db59) | ce5959d |
Časová osa
- zahájeno
- 2026-10-14T07:39:44Z
- ověřeno
- —
- dokončeno
- 2026-10-14T07:39:55Z
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/I2491.yaml. Načtěte ho zpět pomocí majordomus plan show I2491.