two-folder-integration — Repozitář, který adoptuje Majordomus, získá dva adresáře a dva řádky a může je vrátit
Adopce je sladění, nikoli kopie šablony. Jeden typovaný model repozitáře se zjistí jednou a čte ho každý konzument. Žádoucí integrace se spočítá z tohoto modelu, porovná s tím, co repozitář skutečně drží, a aplikuje se jako nejmenší mutace, která mezeru uzavře — vše, co Majordomus vlastní, žije pod `.ai/` a `.majordomus/` a cokoli mimo tyto dva jmenné prostory se redukuje na malý spravovaný most, jehož vlastnictví je zaznamenáno. Dvojí spuštění sladění podruhé nic nezmění a odinstalace vrátí přesně to, co bylo vzato, a nic z toho, co člověk napsal.
AKTIVNÍ 1 z 23 úkolů hotovo
- připraveno
- 2
- blokováno
- 20
- aktivní
- 0
- verify
- 0
- hotovo
- 1
- zrušeno
- 0
Problém
To, co Majordomus zanechává v repozitáři, který přijme, není nikde rozhodnuto; je to součet toho, co každý subsystém náhodou zapsal. Soubory poskytovatelů v kořeni, skripty, konfigurace vedle konfigurace, generované registry, které se staly vstupy, a žádný záznam o tom, které z nich tam Majordomus umístil. Náklady se násobí ve třech směrech najednou. Člověk nepozná, co je jeho a co nástroje, takže nelze bezpečně nic odstranit. Druhý poskytovatel znamená druhou kopii stejných instrukcí místo druhého adaptéru. A každý subsystém znovu objevuje repozitář po svém — CLI, vstup prostředí, dokumentace, server — takže se stejná fakta čtou čtyřmi způsoby a čtvrtý se rozchází.
Výsledek
Adopce je sladění, nikoli kopie šablony. Jeden typovaný model repozitáře se zjistí jednou a čte ho každý konzument. Žádoucí integrace se spočítá z tohoto modelu, porovná s tím, co repozitář skutečně drží, a aplikuje se jako nejmenší mutace, která mezeru uzavře — vše, co Majordomus vlastní, žije pod `.ai/` a `.majordomus/` a cokoli mimo tyto dva jmenné prostory se redukuje na malý spravovaný most, jehož vlastnictví je zaznamenáno. Dvojí spuštění sladění podruhé nic nezmění a odinstalace vrátí přesně to, co bylo vzato, a nic z toho, co člověk napsal.
Aktuální stav
`.ai/` i `.majordomus/` existují a nesou skutečný materiál a smlouvy o adresářích se pod `.ai/` už vynucují (ADR 0011). Proti tomu: bootstrapy providerů se generují do kořene, vstup prostředí a CLI objevují repozitář každý po svém, `init` zapisuje to, co zapisovat měl, ne to, co repozitáři chybí, žádná kniha nezaznamenává, co bylo umístěno mimo oba jmenné prostory, a nic nedokáže adopci vrátit zpět.
Cílový stav
`majordomus init` na cizím repozitáři přidá `.ai/`, `.majordomus/`, spravovaný blok v `AGENTS.md` a — když je žádoucí direnv — jeden stabilní řádek v `.envrc`. Druhé spuštění nehlásí žádnou změnu. `majordomus uninstall` odstraní to, co ledger zaznamenává, a autorskou znalost nechá být. Přidání platného artefaktu pod objevitelný namespace ho zaregistruje všude a žádný seznam nikde nevyjmenovává to, co už objevování najde.
Rozsah
- apps/majordomus-cli/src
- .ai/repo/rules/project
- .ai/repo/adrs
- .majordomus
- share/schemas
- share/skeleton
- dokumentace
- test/cases
- .github/workflows
Mimo rozsah
- Konfigurační formát, který opakuje to, co lze o repozitáři zjistit inspekcí
- Přepsání fungujícího subsystému kvůli symetrii, ne kvůli vadě
- Mazání obsahu napsaného uživatelem na jakékoli cestě, pod jakýmkoli příznakem, bez výslovné a samostatné instrukce
- Druhá konvence worktree, druhý formát předávky nebo druhý doctor
- Sémantika specifická pro providera kdekoli jinde než v adaptéru
Kritéria přijetí
- Vše, co Majordomus v adoptovaném repozitáři uchovává, žije pod `.ai/` nebo `.majordomus/` a každá výjimka mimo ně je most zaznamenaný v knize vlastnictví
- Jeden typovaný model repozitáře se objeví jednou za proces a každý konzument — CLI, prostředí, API, MCP, Cockpit, dokumentace, poskytovatelé, doplňování — čte tento model, ne souborový systém
- Požadovaná integrace je hodnota, plán je diff proti tomu, co existuje, a aplikace je nejmenší mutace, která ho uzavře
- Druhé `init` na vyhovujícím repozitáři nevyvolá žádnou změnu, což dokazuje test, ne pozorování
- `uninstall` vrátí každou zaznamenanou mutaci, odmítne se dotknout mostu, který člověk upravil, a ve výchozím stavu ponechá napsaný obsah `.ai/` na místě
- Každý generovaný artefakt deklaruje svůj původ, svůj generátor a vstupy, ze kterých se odvozuje, a žádný generovaný artefakt se nečte zpět jako kanonický vstup
- Žádný ručně udržovaný seznam nevypisuje artefakty, které objevování nachází, a přidání platného artefaktu ho zaregistruje u každého konzumenta bez druhé úpravy
- Vstup do prostředí zůstává lokální a omezený, bez sítě a bez sestavení, a jeho cena se měří proti deklarovanému rozpočtu
- Každý invariant výše je pravidlo projektu s kontrolou, kterou CI spouští, a každé je dokázáno negativním testem
Validace
- cargo test --workspace --all-features
- bash test/run.sh
- bin/majordomus doctor
- majordomus generate --check
- majordomus init --dry-run
Požadované důkazy
- footprint_bounded
- one_model
- desired_state_diff
- init_idempotent
- uninstall_reverses
- provenance_declared
- no_manual_registry
- entry_budget
- rules_enforced
Rizika
- Reconciler, který vypočítá požadovaný stav, jej může také vnutit. Vše, co by změnil mimo dva jmenné prostory, musí být před aplikací viditelné v dry runu a most, který člověk upravil, je konflikt, ne přepsání.
- Jeden model repozitáře je úzké hrdlo stejně jako páteř: každý konzument, který ho čte, platí cenu za jeho objevení. Cena se musí změřit proti rozpočtu vstupu do prostředí dříve, než se model stane povinným, ne potom.
- Migrace vlastní stopy tohoto repozitáře je nejnebezpečnější fáze, protože nástroj mění to, čím se mění. Migrace běží přes rekonciliátor, nejprve nanečisto, nikdy přes přesouvací skript.
- Ledger vlastnictví, který se rozchází se souborovým systémem, je horší než žádný: povoluje mazání, které nedokáže zdůvodnit. Každá zaznamenaná mutace nese hash, s nímž byla zapsána, a nesoulad odstranění zastaví.
- Adaptéry poskytovatelů zvou k tomu, aby sémantika poskytovatele prosákla do modelu. Test je, zda je nový poskytovatel implementací jednoho traitu, nebo úpravou na šesti místech.
Úkoly
Každý z nich je prováděcí kontrakt s vlastními kritérii přijetí, validačním příkazem a požadovanými důkazy. Sloupec wave je vrstva grafu závislostí, v níž úkol leží.
| issue | status | vlna | závisí na | název |
|---|---|---|---|---|
| I1101 | HOTOVO | 0 | — | Co tento nástroj za sebou zanechává, zjištěno kontrolou, ne z paměti |
| I1102 | PŘIPRAVENO | 1 | I1101 | Oba jmenné prostory jsou typovaný kontrakt, ne zvyk |
| I1103 | BLOKOVÁNO | 2 | I1102 | Zda je soubor psaný ručně, nebo odvozený, je pole, ne konvence pojmenování |
| I1104 | BLOKOVÁNO | 2 | I1102 | Oba jmenné prostory nesou své kontrakty, až do dna |
| I1105 | PŘIPRAVENO | 1 | I1101 | Repozitář se zjišťuje jednou, do jednoho modelu |
| I1106 | BLOKOVÁNO | 2 | I1105 | Registry jsou pohledy na model, ne samostatná zjišťování |
| I1107 | BLOKOVÁNO | 3 | I1106 | Zjišťování je deterministické, cachované a jeho cena je známa |
| I1108 | BLOKOVÁNO | 3 | I1106 | Požadovaná integrace je hodnota a plán je diff |
| I1109 | BLOKOVÁNO | 4 | I1108 | Vše umístěné mimo oba jmenné prostory se zaznamená, i s tím, čím to bylo |
| I1110 | BLOKOVÁNO | 5 | I1109 | Druhý běh nic nezmění a test to říká |
| I1111 | BLOKOVÁNO | 5 | I1109 | Odinstalace vrátí přesně to, co bylo vzato |
| I1112 | BLOKOVÁNO | 5 | I1109 | Kořene se dotýkají dva malé bloky a už se nikdy nezmění |
| I1113 | BLOKOVÁNO | 6 | I1112 | Vstup do adresáře je lokální, omezený a o síti mlčí |
| I1114 | BLOKOVÁNO | 6 | I1112 | Provider je adaptér nad modelem a přidat ho je implementace |
| I1115 | BLOKOVÁNO | 7 | I1114 | Doplňování vychází z modelu příkazů, ne z druhého seznamu |
| I1116 | BLOKOVÁNO | 6 | I1110, I1112 | Vlastní stopa tohoto repozitáře se mění prostřednictvím reconcileru |
| I1117 | BLOKOVÁNO | 3 | I1106 | Ručně udržované seznamy se odstraní, nenechají se běžet vedle odvozování |
| I1118 | BLOKOVÁNO | 7 | I1110, I1116 | Každá invariantní podmínka tohoto milníku je pravidlo s kontrolou, která běží |
| I1119 | BLOKOVÁNO | 7 | I1113 | Rozpočty se měří a regrese shodí build, místo aby si jí někdo všiml |
| I1120 | BLOKOVÁNO | 4 | I1108 | Odmítnutí říká, co s ním dělat |
| I1121 | BLOKOVÁNO | 6 | I1112 | Každý povrch ukazuje integraci z jednoho modelu |
| I1122 | BLOKOVÁNO | 7 | I1110, I1111, I1116, I1121 | Cizí repozitář, převzatý, povýšený a vrácený |
| I1123 | BLOKOVÁNO | 8 | I1104, I1107, I1115, I1117, I1118, I1119, I1120, I1122 | Milník se přijímá na základě svých důkazů |
Graf
flowchart LR
I1101["I1101<br/>What this tool leaves behind, established by inspection rather than by memory"]:::done
I1102["I1102<br/>The two namespaces are a typed contract, not a habit"]:::ready
I1103["I1103<br/>Whether a file is authored or derived is a field, not a naming convention"]:::blocked
I1104["I1104<br/>Both namespaces carry their contracts, all the way down"]:::blocked
I1105["I1105<br/>The repository is discovered once, into one model"]:::ready
I1106["I1106<br/>The registries are views of the model, not separate discoveries"]:::blocked
I1107["I1107<br/>Discovery is deterministic, cached, and its cost is known"]:::blocked
I1108["I1108<br/>The desired integration is a value, and the plan is a diff"]:::blocked
I1109["I1109<br/>Everything placed outside the two namespaces is recorded, with what it was"]:::blocked
I1110["I1110<br/>The second run changes nothing, and a test says so"]:::blocked
I1111["I1111<br/>Uninstall gives back exactly what was taken"]:::blocked
I1112["I1112<br/>What touches the root is two small blocks, and they never change again"]:::blocked
I1113["I1113<br/>Entering a directory is local, bounded and silent about the network"]:::blocked
I1114["I1114<br/>A provider is an adapter over the model, and adding one is an implementation"]:::blocked
I1115["I1115<br/>Completion comes from the command model, not from a second list"]:::blocked
I1116["I1116<br/>This repository's own footprint moves, through the reconciler"]:::blocked
I1117["I1117<br/>The hand-maintained lists are removed, not left running beside the derivation"]:::blocked
I1118["I1118<br/>Every invariant of this milestone is a rule with a check that runs"]:::blocked
I1119["I1119<br/>The budgets are measured, and a regression fails rather than being noticed"]:::blocked
I1120["I1120<br/>A refusal says what to do about it"]:::blocked
I1121["I1121<br/>Every surface shows the integration from the one model"]:::blocked
I1122["I1122<br/>A foreign repository, adopted, upgraded and given back"]:::blocked
I1123["I1123<br/>The milestone is accepted on its evidence"]:::blocked
I1101 --> I1102
I1101 --> I1105
I1102 --> I1103
I1102 --> I1104
I1104 --> I1123
I1105 --> I1106
I1106 --> I1107
I1106 --> I1108
I1106 --> I1117
I1107 --> I1123
I1108 --> I1109
I1108 --> I1120
I1109 --> I1110
I1109 --> I1111
I1109 --> I1112
I1110 --> I1116
I1110 --> I1118
I1110 --> I1122
I1111 --> I1122
I1112 --> I1113
I1112 --> I1114
I1112 --> I1116
I1112 --> I1121
I1113 --> I1119
I1114 --> I1115
I1115 --> I1123
I1116 --> I1118
I1116 --> I1122
I1117 --> I1123
I1118 --> I1123
I1119 --> I1123
I1120 --> I1123
I1121 --> I1122
I1122 --> I1123
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxOdkazováno z tohoto diagramu (23)
- I1101 Co tento nástroj zanechává, zjištěno prohlídkou, ne z paměti
- I1102 Dva jmenné prostory jsou typovaný kontrakt, ne zvyk
- I1103 Zda je soubor psaný ručně, nebo odvozený, je pole, ne konvence pojmenování
- I1104 Oba jmenné prostory nesou své kontrakty až do dna
- I1105 Repozitář se objevuje jednou, do jednoho modelu
- I1106 Registry jsou pohledy na model, ne samostatná discovery
- I1107 Discovery je deterministické, cachované a jeho cena je známá
- I1108 Požadovaná integrace je hodnota a plán je diff
- I1109 Všechno umístěné mimo dva jmenné prostory se zaznamená, i s tím, co to bylo
- I1110 Druhý běh nic nezmění a test to říká
- I1111 Odinstalace vrátí přesně to, co bylo vzato
- I1112 To, čeho se dotýká kořen, jsou dva malé bloky a nikdy se už nemění
- I1113 Vstup do adresáře je lokální, omezený a o síti mlčí
- I1114 Provider je adaptér nad modelem a přidání jednoho je implementace
- I1115 Doplňování vychází z modelu příkazů, ne z druhého seznamu
- I1116 Vlastní stopa tohoto repozitáře se přesouvá přes reconciler
- I1117 Ručně udržované seznamy se odstraňují, nenechávají se běžet vedle odvození
- I1118 Každý invariant tohoto milníku je pravidlo s kontrolou, která běží
- I1119 Rozpočty se měří a regrese způsobí selhání, ne aby si jí někdo všiml
- I1120 Odmítnutí říká, co s tím dělat
- I1121 Každý povrch ukazuje integraci z jednoho modelu
- I1122 Cizí repozitář, převzatý, upgradovaný a vrácený
- I1123 Milník se přijímá na základě svých důkazů
Kanonický záznam: .ai/repo/project/milestones/two-folder-integration.yaml. Přečtěte ho zpět pomocí majordomus plan show two-folder-integration.