Majordomus je vytvořen k tomu, aby se commitoval: polovina vrstvy .ai/repo/ cestuje s repozitářem, aby každý klon a každý pracovník četl stejná pravidla. Někdy to není na vás. Pracujete v repozitáři, který vlastní tým, chcete, aby vaše vlastní úlohy měly rozsah a smlouvu o dokončení, chcete briefing na začátku relace a UI nad vlastními záznamy, a do týmového stromu nesmíte přidat commit, řádek .gitignore ani nový soubor.
Osobní režim je název pro toto uspořádání: vrstva žije vedle kódu, jen ve vašem klonu, a repozitář zůstává bajt po bajtu tím, co tým commitnul. Organizace mají pro hardwarovou verzi tohoto slovo už léta: bring your own device. Toto je tentýž obchod o úroveň výš, bring your own discipline. Návyky a nástroj jsou vaše, repozitář a jeho pravidla organizace, a jedno druhé nemění.
Existuje pro to přepínač: majordomus init --personal a --personal u instalátoru (ADR 0145, claims/personal-layer-changes-nothing-shared.md). Přepínač říká, co dělá. Zbytek této stránky je měření, z něhož byl přepínač postaven, provedené ručně 2026-10-12 ve scratch repozitáři (jeden git init, README, jeden zdrojový soubor, jeden commit) proti released buildu toho dne, který přepínač neměl. Zůstává, protože ukazuje, čím je každý kus a proč je to běžná praxe. Každý krok říká, zda byl spuštěn. Dva spuštěny nebyly a jsou jmenovány. Kde přepínač mění níže uvedené tvrzení, tvrzení to říká.
Přepínač
majordomus init --personal
majordomus update
majordomus doctor
init --personal vytvoří vrstvu, kterou vytvoří obyčejné init, zakryje ji ve vyznačeném bloku souboru exclude gitu pro daný klon a skončí exitem 10, pokud git status po něm nečte totéž co předtím. Co dělá, co ručně vytvořené uspořádání níže nedělalo:
| Ručně, níže | S přepínačem |
|---|---|
init zapíše dva řádky do .gitignore, obnovené pomocí git checkout .gitignore | .gitignore není zapsáno |
| řádky exclude jsou typované a nic je nekontroluje | jeden označený blok, ověřovaný pomocí init, instalátorem a každým doctor |
politika je zúžena tak, aby update zapisoval jeden soukromý soubor | init --personal přizpůsobí zaseté projekce repozitáři: cíl, který projekt už sleduje, se přesune do souboru, který jeho poskytovatel čte pro jednu osobu (personal_target v share/providers.yaml, CLAUDE.local.md pro Claude Code), a poskytovatel bez takového souboru se vynechá. update pokryje každý cíl před zápisem a stále celou odmítne politiku, která jmenuje sledovaný cíl |
capture install nebylo spuštěno, protože zapisuje pod .claude/ | pokrývá to, co zapisuje, stejným způsobem |
| commit a push záznamu relace jsou v politice vypnuty | pod osobní vrstvou nenastane ani jedno, ať politika říká cokoli |
server potřebuje --discovery filesystem, spuštěný před klientem | objevování samo prochází pracovní strom, když vrstva není nikde sledována |
doctor uchovává selhání týkající se README | README projektu se nežádá, aby jmenovalo AGENTS.md |
převod znamená smazat řádky exclude a init --extend | majordomus init --extend --shared |
Hook si stále přidáváte sami a to, co politika organizace říká o nástrojích, je stále věcí organizace. Kam ho přidat, určuje git a init to vypíše: pod .git/hooks/ se ty dva řádky vloží přímo. Tam, kde core.hooksPath ukazuje na adresář, který projekt sleduje, je hook volaný gitem hookem projektu; dispečer, který spouští <hook>.d/, nechává místo pro váš vlastní soubor <hook>.d/majordomus-personal, který init --personal pokrývá ještě před jeho vznikem, a sledovaný hook bez takového adresáře nemá žádné místo pro váš vlastní soubor, což init oznámí místo toho, aby radil upravit sdílený soubor.
K čemu slouží
Uspořádání je nenarušující v přesném smyslu: diff repozitáře je prázdný, nikdo nic neposuzuje, žádný checkout kolegy se nechová jinak, CI běží to, co běželo dřív, a odstranění je smazání adresáře. Proto je použitelné v situacích níže, kde běžné zavedení není dostupné nebo ještě není zasloužené.
| Situace | Co z toho máte |
|---|---|
| Vyzkoušet to dřív, než to navrhnete. Myslíte si, že by to týmu prospělo, a nemáte co ukázat. | Dva týdny vlastních úloh s rozsahem, smlouvou o dokončení a předávkami na skutečném repozitáři. Navrhnete to se záznamy místo názoru. |
| Dodavatel nebo konzultant v repozitáři klienta. Konvence jsou klientovy a nepatří vám je rozšiřovat. | Vaše vlastní disciplína cestuje s vámi: každé nasazení začíná briefingem a končí předávkou a strom klienta je takový, jaký jste jej našli. |
| Audit, revize nebo due diligence. Zadání je číst a měnit repozitář je mimo meze. | Nálezy, rozhodnutí a otevřené otázky jako typované záznamy, každý vázaný na commit, ve kterém vznikl, takže nález sám říká, kdy se kód pod ním pohnul. |
| Přispívání do open-source projektu. Upstream nechce soubory vašeho nástroje, a právem. | Rozsah drží příspěvek u cest, kterých se týkal, a kontrakt dokončení žádá o ověřovací příkaz dřív, než otevřete pull request. |
| Učení se kódové základny, kterou jste nenapsali. | To, co zjistíte, se zapíše jednou, jako kandidáti znalostí a rozhodnutí, a je v briefingu příští relace, místo aby se zjišťovalo znovu. |
| Repozitář, kde je přidání souboru žádostí o změnu. Regulovaný kód, zmrazená větev release, dodávka od dodavatele. | Vrstva je vedle kódu, ne v něm, takže není co schvalovat. |
| Práce s AI agentem na vlastní pěst. | Agent čte vaše pravidla a váš kontext z CLAUDE.local.md a rozsah úlohy odmítne změnu mimo cesty, které jste jmenovali. Instrukční soubory týmu zůstávají nedotčeny. |
| Stejné návyky v každém repozitáři. | Jeden životní cyklus všude, ať jsou konvence jednotlivých repozitářů jakékoli. |
K čemu není: k ničemu, co potřebuje, aby byla vrstva sdílená. Pravidla, jimž je tým vázán, nástěnka, na které se kolegové vidí, plán, z něhož pracuje více lidí, a důkazy, které zaznamenává CI, všechno to potřebuje commitnutou adopci v ADOPTION.md. Toto uspořádání je nástroj jedné osoby.
Tři způsoby spuštění
| Osobní režim | Commitnutá adopce | Commitnuto, s meshem | |
|---|---|---|---|
| kde vrstva žije | tento klon, vyloučený z gitu | .ai/repo/ v repozitáři | totéž, s runtime propojenými napříč stroji |
| kdo čte pravidla | vy a váš AI klient | každý klon a každý worker | každý stroj |
| kdo musí souhlasit | nikdo, protože se pro nikoho nic nemění | tým, review pull requestu | tým a kdokoli, komu stroje patří |
| co odmítá změnu | váš vlastní hook pre-push | hooky a kontroly CI | totéž |
| nástěnka peerů | vaše vlastní relace | každý pracovník repozitáře | pracovníci všech strojů |
| záloha | je na vás | git | git |
| opouští | smazání adresáře | pull request | pull request |
Sloupce jsou stejně tak cesta jako volba. Osobní režim je místo, kde jednotlivec zjistí, zda se životní cyklus vyplatí; Od osobního ke sdílenému je změřená cesta od prvního sloupce ke druhému a MESH.md je třetí.
Proč je to běžná praxe
Každý mechanismus používá k tomu, k čemu byl vytvořen.
.git/info/excludeje vlastní odpověď gitu na „vzory specifické pro pracovní postup jedné osoby, které se nemají sdílet“. Je to zdokumentovaná alternativa k.gitignorepřesně pro tento účel.CLAUDE.local.mdje soubor, který AI klient čte pro instrukce jedné osoby vedle instrukcí projektu.- Hooky pod
.git/hooks/git nikdy nesdílel; každý klon má své vlastní. - Osobní nastavení editoru,
.envrc.local, pracovní adresář a soukromý soubor poznámek jsou stejná kategorie věcí a každý vývojář nějaké z nich už má.
Co zůstává přesně tak, jak bylo, je to, co záleží všem ostatním. Vaše commity jsou běžné commity a revidují se jako jakékoli jiné. CI je posuzuje kontrolami, které tým zvolil. Žádná kontrola týmu se neobchází, neoslabuje ani se na ni neodpovídá jeho jménem a nic neopouští stroj: Majordomus nevolá žádný model a nikam nic neposílá.
Tři věci, které uspořádání nemění a které stále dlužíte:
- Politika nástrojů organizace. Kde rozhoduje, které nástroje smějí číst repozitář, platí to i pro nástroj, který žije jen ve vašem klonu. Soukromé neznamená povolené.
- Politika dat AI klienta. Vrstva je lokální; klient, který ji čte, být nemusí. Pokud na tomto kódu nejsou AI nástroje povoleny, tohle je nepovoluje.
- Poctivost ohledně vaší práce. To, co zůstává lokální, je nástroj, nikdy změna. Když se kolega zeptá, jak si držíte úlohy v pořádku, odpověď je jedna věta, a až se osvědčí, dalším krokem je navrhnout commitnuté zavedení.
Odchod
Odebrání je stejně malé jako přidání a nechá repozitář bit po bitu tak, jak byl.
rm -rf .ai CLAUDE.local.md .git/hooks/pre-push
git status --short --ignored
Pak smažte řádky, které jste přidali do .git/info/exclude. Druhá cesta ven, sdílení vrstvy, je Od osobního ke sdílenému.
Kde všechno skončí
| Místo | Co tam je | Kdo to vidí |
|---|---|---|
| commitnuté soubory | nic nového; git status zůstává čistý | tým |
| pracovní strom, vyloučen | .ai/repo/, .ai/local/, CLAUDE.local.md | pouze tento disk |
.git/ | info/exclude, hooks/pre-push | pouze tento klon; git jej nikdy nepushuje |
.git/info/exclude má syntaxi .gitignore a žádnou z jeho viditelnosti: není to soubor pracovního stromu, takže se nikdy necommituje. Žije ve společném adresáři gitu, což znamená, že platí i pro každý linked worktree klonu.
Co Majordomus zapisuje a jak je každá část držena stranou
| Co se objeví | Zapsal | Vyloučeno kým | Změřeno |
|---|---|---|---|
adresář .ai/ | init | řádek .ai/ v .git/info/exclude | ano |
dva řádky připsané do .gitignore | init | git checkout .gitignore; vyloučení .ai/ pokrývá obojí | ano |
AGENTS.md, CLAUDE.md, GEMINI.md | update | jedna projekce zbývá v soukromé politice, do CLAUDE.local.md, vyloučena | ano |
| git hooky | vy, ručně | .git/hooks/ je ze své podstaty lokální; pre-push stačí | ano |
soubor nastavení Claude Code a .claude/hooks/ | capture install | vyloučit obojí; kde tým sleduje tento soubor nastavení, capture install nespouštějte | ne |
.mcp.json | vy, ručně | zaregistrovat server MCP pro uživatele, ne pro projekt | ne |
Kroky, ručně
Takto vypadalo uspořádání, než přepínač existoval. Stále funguje a je to to, co číst, když přepínač něco odmítne a chcete vědět proč.
majordomus init
git checkout .gitignore
printf '.ai/\nCLAUDE.local.md\n' >> .git/info/exclude
git status --short
init připojí .ai/local/ a .ai/repo/**/.tmp.* do .gitignore. Obnovení souboru nic neztratí, protože řádek exclude pokrývá celý adresář. Poslední příkaz nevypisuje nic.
Politika v .ai/repo/policy.yaml je nyní jen vaše. Nechte v ní jedno vynucování a jednu projekci:
enforcement:
- name: finish-on-push
path: majordomus
args: [finish, --check]
wired_by: git-hook:pre-push
projections:
- provider: claude-code
target: CLAUDE.local.md
always_loaded: true
session:
commit_record_on_end: false
push_record_on_end: false
Dva klíče session jsou opatření navíc. Osazená politika (share/skeleton/policy.yaml) commituje a pushuje záznam relace při uzavření epizody. Co ty s vyloučenou vrstvou dělají, nebylo změřeno, proto jsou zde vypnuté. Ze stejného důvodu continuity publish a continuity sync nejsou pro toto uspořádání: pushují ref na sdílené vzdálené úložiště, kde ho může číst každý.
doctor odmítne politiku bez položky vynucování a takovou, ve které není žádná projekce označena always_loaded, takže po jedné od každé je minimum. CLAUDE.local.md je soubor, který Claude Code čte vedle CLAUDE.md týmu, jenž zůstává, jaký je.
majordomus update
printf '#!/bin/sh\nmajordomus finish --check || exit $?\n' > .git/hooks/pre-push
chmod +x .git/hooks/pre-push
Nezapojujte doctor do pre-commit zde. V tomto uspořádání si ponechává jedno selhání, které nelze odstranit (níže), a hook, který selhává vždy, odmítne každý commit.
majordomus serve --discovery filesystem
To je krok, na kterém záleží. Objevování má výchozí hodnotu vcs: spustitelný soubor se ptá indexu gitu, které soubory existují, a vyloučená vrstva v žádném indexu není. Změřeno, výchozí hodnota čte:
index built objects=1 diagnostics=4 state=Degraded
required class 'policy' (:(glob).ai/repo/policy.yaml) discovered nothing
required class 'rule' (:(glob).ai/repo/rules/**/*.md) discovered nothing
S --discovery filesystem se tentýž strom čte jako state ok, s jeho politikou, profily, prompty a vendorovanými pravidly jako objekty, a server odpovídá na /ui a /cockpit. Spusťte jej před AI klientem: klient se připojí k serveru, který už běží, a převezme jeho volby, a ten, který spustí vlastní, převezme výchozí.
Odtud je životní cyklus úlohy obvyklý. V pokusném repozitáři check započítal jediný upravený zdrojový soubor jako uvnitř rozsahu, finish --check v hooku prošlo a git status ukázalo ten soubor a nic z vrstvy. finish také odmítlo --verify-command "true": příkaz, který nedělá nic, nic neověřuje.
Jak zapadá do zbytku nástroje
| Součást nástroje | V tomto uspořádání | Proč |
|---|---|---|
životní cyklus úlohy: start, check, finish | funguje, změřeno | check započítalo upravený soubor dovnitř rozsahu a finish --check prošlo |
| rozsah úlohy | funguje, změřeno | git status ukázal změnu zdroje a nic z vrstvy |
| briefing a kontext | funguje, změřeno | context vypsal git, úlohu a profil |
| checkpointy, předávky, rozhodnutí | funguje | jsou lokálními záznamy i v commitnutém zavedení |
| projekce instrukcí | funguje, změřeno | update zapsalo CLAUDE.local.md a žádný jiný soubor |
hook pre-push | funguje, změřeno | žije pod .git/hooks/ tohoto klonu |
server, /ui a Cockpit | funguje s --discovery filesystem, změřeno | výchozí discovery se ptá indexu gitu |
| plán | funguje lokálně | /cockpit/plan odpověděl |
doctor | jedno selhání zůstává | README nejmenuje AGENTS.md |
| MCP nástroje pro AI klienta | nejprve spusťte server | čtení vrstvy bylo změřeno; připojený klient ne |
| nástěnka peerů | jen vaše vlastní relace | nikdo jiný se k vašemu serveru nepřipojuje |
| záznamy znalostí | lokální | kandidáti se odvozují pro jednoho čtenáře; odvození při uzavření epizody nebylo měřeno |
| kniha důkazů | lokální | nepodporuje žádnou záruku, kterou čte někdo jiný |
| Hooky relací Claude Code | neměřeno | capture install zapisuje pod .claude/ v pracovním stromu |
| commit a push záznamu relace | vypnout | dva klíče politiky výše |
continuity publish a sync | nepoužívat | pushují ref na sdílený remote |
| mesh | nepoužívat | sdílí metadata relací a claimů s dalšími stroji |
| Kontroly CI | není co plánovat | soukromá vrstva nedeklaruje žádný model CI; CI týmu zůstává nedotčeno |
Na čem každý výrok stojí
| Výrok | Kde se rozhoduje |
|---|---|
init zapíše .ai/ a dva řádky .gitignore a nenainstaluje žádný hook | lib/init.sh, test/cases/01_init.sh, claims/local-state-ignored.md, claims/ai-layer-manifest.md |
| instrukční soubory jsou projekce politiky a cíl projekce je jeden řádek | lib/update.sh, claims/projection-generation.md, claims/region-projection.md |
dotčený soubor mimo rozsah je selhání a finish vyhodnocuje svou smlouvu řádek po řádku | claims/scope-enforcement.md, claims/finish-contract.md |
| ověřovací příkaz, který nic nedělá, je odmítnut | verification-integrity |
| nástroj shellu neprovádí žádné síťové volání | claims/no-network.md, no-network-no-eval |
| osobní vrstva nemění nic sdíleného a příkaz, který to říká, to ověřuje | lib/common.sh, test/cases/2979_a_personal_layer_changes_nothing_shared.sh, claims/personal-layer-changes-nothing-shared.md |
| objevování může procházet pracovní strom místo dotazování indexu | apps/majordomus-cli/src/cli.rs, MCP.md, the-server-sees-the-current-tree |
| co worker nikdy nečte, je deklarováno jednou | claims/scope-declared.md, SCOPE.md |
Co se nevejde
- Ručně
doctorponechá jedno selhání. Z šesti, které hlásí čerstvé zavedení, pět odpadne s výše uvedenou politikou a hookem. Zbývábootstrap README.md — does not name AGENTS.mda jeho odstranění vyžaduje úpravu README. S přepínačem se tato kontrola na osobní vrstvu neuplatňuje. - Vydaný build nemá příkaz
ui. Povrch/uise servíruje; otevřete jej v prohlížeči. - Nic se nesdílí, takže nic není zálohováno. ADR, záznamy znalostí, záznamy relací a plán existují na jednom disku.
git clean -fdxje smaže, protože-xodstraňuje vyloučené soubory agit stash -aje skrývá. Zkopírujte.ai/jinam. - Pohled na tým je pohled gitu. Nástěnka ukazuje vaše vlastní relace. Co víte o kterémkoli jiném, říkají jeho větve a commity. Zda
/uičte pull requesty jiného repozitáře, nebylo změřeno. - Dva řádky tabulky výše nebyly spuštěny. Relační hooky Claude Code a registrace MCP mimo repozitář jsou popsány podle toho, jak jsou postaveny, ne podle běhu.
Od osobního ke sdílenému
Osobní režim splnil svůj úkol, když dokážete ukázat, co vám dal. Návrh týmu je pak pull request a sada záznamů, ne názor: úlohy, které jste spustili s rozsahem, předávky, od kterých relace začala, kolikrát finish odmítlo. Konverze byla změřena 2026-10-12 ve scratch repozitáři, jehož vrstva stále nesla osazenou politiku.
S přepínačem je to jeden příkaz, majordomus init --extend --shared: odstraní zakrytí, přidá dva řádky .gitignore, vypíše, co je nyní třeba v repozitáři commitnout, a nic necommituje. Ručně to bylo toto.
Smažte dva řádky, které jste přidali do .git/info/exclude. git status --short pak ukáže vrstvu jako jeden nesledovaný adresář. Potom:
majordomus init --extend
majordomus update
majordomus doctor
Co tam každý dělal:
| Krok | Naměřený výsledek |
|---|---|
| odstranění řádků exclude | git status --short ukazuje ?? .ai/ a nic jiného |
init --extend | přidá .ai/local/ a .ai/repo/**/.tmp.* zpět do .gitignore, a nic jiného |
git add -A -n | jmenuje 96 cest pod .ai/ a .gitignore; žádná z nich není pod .ai/local/ |
update | se zaseté politikou vytvoří AGENTS.md, CLAUDE.md a GEMINI.md |
doctor | dvě selhání, obě v zapojení: hooky pre-commit a pre-push, které jmenuje, nejsou nainstalovány |
Politika, kterou jste zúžili pro osobní režim, se sama nerozšíří. Před update vraťte její bloky projections a enforcement na to, co tým chce, počínaje share/skeleton/policy.yaml; tato úprava nebyla součástí měření. Vaše vlastní záznamy pod .ai/local/ zůstávají lokální v každém uspořádání. Odtud je cesta ADOPTION.md.
Jak to říct
Nic na osobním režimu nevyžaduje pečlivou odpověď. Co potřebuje každý tazatel, je krátké a rozhoduje se to někde, kde se to dá přečíst.
| Kdo se ptá | Co platí | Kde se rozhoduje |
|---|---|---|
| kolega | moje úlohy, jejich rozsah a moje předávky jsou v lokálním adresáři, který git ignoruje; nic z toho není v repozitáři | git status --short --ignored v mém klonu |
| vedoucí týmu | repozitář, jeho recenze a jeho CI jsou přesně takové, jaké byly; pokud se ukáže jako užitečné, navrhnu to jako pull request | Od osobního ke sdílenému |
| bezpečnost | nástroj nevolá žádný model a neposílá telemetrii a jeho síťové použití jsou čtení serveru, meshe a forge, která spustíte; AI klient, který používám, je ten, který organizace už povoluje, pod stejnou politikou dat | claims/no-network.md, no-network-no-eval |
| architekt | stejný životní cyklus, jaký běží commitnutá adopce, se soukromou politikou; žádné pravidlo týmu se neopakuje ani nepřepisuje | ADOPTION.md |
| kdokoli vlastní politiku nástrojů | je to lokální nástroj v kategorii konfigurace editoru a podléhá politice o tom, které nástroje smějí číst tento kód | politika organizace, kterou toto nemění |
Co zůstává viditelné
Osobní neznamená skrytý. Toto jsou místa, kde je uspořádání vidět, a každé stojí za to znát dřív, než se sdílí obrazovka.
git add -fpřidá vyloučenou cestu. Před commitem si přečtětegit status.- Trailery commitů, tvar zpráv commitů a názvy větví vidí každý.
- Banner nakreslený při vstupu do adresáře je viditelný na sdílené obrazovce;
MAJORDOMUS_BANNER=offjej vypne. git check-ignore -v .ai/manifest.yamljmenuje řádek.git/info/exclude, který vrstvu vylučuje, agit status --ignoredvypíše vše vyloučené.
Soukromé neznamená povolené. Kde organizace rozhoduje, které nástroje smějí číst repozitář, to rozhodnutí pokrývá i nástroj, který žije jen ve vašem klonu. Majordomus nikam nic neposílá a nevolá žádný model; to dělá AI klient, který jej používá.
Související
ADOPTION.mdpro běžnou, commitnutou adopci.INSTALL.mdpro instalátor.MCP.mdpro sdílený server, jeho režimy zjišťování a co klient zdědí.SCOPE.mdpro to, co spustitelný soubor z repozitáře vůbec čte.