Repozitář opouští stroj častěji, než to vypadá. Jde k jazykovému modelu, který ho přečte celý najednou, k recenzentovi, který ho nemůže naklonovat, k auditorovi, který musí spustit kontroly jinde než v checkoutu, z něhož je dostal, do případu podpory, do sítě odděleném vzduchovou mezerou. Každé z toho se tu dělalo ručně, s git ls-files, tar a seznamem vyloučení přepsaným z paměti, a ručně vyrobená verze udělala dvě chyby, které vyplavou až na druhém konci — tam, kde nikdo nemůže porovnat kopii s originálem a kde obě selhání vypadají jako repozitář je rozbitý, ne jako kopie je špatná.
majordomus archive je to gesto, zapsané jednou. Reference příznaků je CLI.md; tento dokument je o tom, proč má takový tvar a jak změnit, co vytváří.
Co putuje
Sadou souborů je index gitu, a jen index gitu.
Nic nesledovaného se nikdy nearchivuje: ani target/, ani node_modules/, ani cache, a — to podstatné — ani .ai/local/, což je stav tohoto checkoutu, který git záměrně ignoruje a který se nikdy nesdílí. To je jedno pravidlo místo seznamu věcí, na jejichž vyloučení je třeba pamatovat, a díky němu je příkaz bezpečné namířit na repozitář, který nikdo nečetl. Seznam vyloučení selhává otevřeně: cokoli zapomněl, cestuje. Tohle selhává uzavřeně.
Důsledek, který stojí za znalost, je, že necommitnutá práce ve sledovaném souboru je archivována — obsah pochází z pracovního stromu — zatímco nový soubor, který nikdy nebyl git add, ne. _ARCHIVE/GIT.txt zaznamenává commit, větev a zda byl strom při pořízení archivu špinavý, aby druhá strana poznala, co drží.
Co se vynechává a kdo o tom rozhoduje
Kromě „untracked“ jsou odečty deklarovány v share/archive.yaml, jeden blok na profil:
| Pojem | Význam |
|---|---|
derived: drop | Zahodit každou cestu, kterou .gitattributes označí merge=derived. |
binary: drop | Vyřadit podle přípony souboru z jednoho seznamu na začátku registru a podle obsahu: co git v indexu posuzuje jako -text. |
artifacts: drop | Zahoďte každou cestu ze seznamu artifact_paths registru — výstup buildu, adresáře závislostí a cache, kontejnery worktree, minifikované svazky — a každý symbolický odkaz. include žádný z nich nikdy nevrátí. |
exclude: | Shellové glob vzory pro to, co nevyjadřuje ani jedno pravidlo. * odpovídá i /. |
include: | Shellové globy, aplikované naposled, které vrátí vyřazenou cestu zpět. |
První z nich je zajímavá. Každá generovaná projekce v tomto repozitáři je už označena merge=derived v .gitattributes, z nesouvisejícího důvodu — merge dvou větví nikdy není odpovědí pro soubor, jehož obsah je funkcí sloučeného stromu. Archiv pro čtenáře chce vypustit přesně tuto množinu, protože každý z těch souborů je projekcí kanonického souboru, který archiv už nese, a nést obojí vyčerpává pozornost čtenáře na stejné tvrzení dvakrát. Archiv proto čte tuto deklaraci, místo aby vedl druhý seznam generovaných cest. Druhý seznam by byla duplikace, kterou project.commands-are-projections existuje, aby odmítl, a zastaral by poprvé, kdy někdo přidá generátor a aktualizuje jen jeden ze dvou.
V tomto repozitáři toto jediné pravidlo odpovídá za přibližně 15 MB z 29 MB sledovaných.
Věrnost: režimy a index
zip -X odstraní doplňková pole, která nesou unixový režim souboru. Archiv vypadá v pořádku, počet položek sedí, každý bajt obsahu je tam — a v rozbaleném stromu není nic spustitelné. Každý skript selže a člověk na druhém konci hlásí, že je repozitář rozbitý.
Chybějící index gitu je stejná třída selhání a ještě tišší. Tento repozitář se vyjmenovává pomocí git ls-files; kontrola spuštěná ve stromu bez .git neselže, nic neprozkoumá a ohlásí, že nic není špatně. To je tvar, o kterém byla napsána project.empty-is-not-failure, jen přišel přes archiv, ne přes kód.
Obojí se odpovídá uvnitř archivu, ne v poznámce vedle něj:
- Režim každé položky se čte z indexu gitu — z autority, ne z pracovního stromu, jehož režimy mohlo předchozí nedbalé kopírování už zploštit — a zapisuje se do
_ARCHIVE/MANIFEST.txtjako<mode> <size> <path>. _ARCHIVE/restore.shznovu použije každý režim z toho manifestu a vytvoří git repozitář, jehož jediný commit je tento strom. Je to POSIXsh, běží tam, kde se archiv otevře, a je idempotentní vůči existujícímu.git.- Než se příkaz vrátí, archiv, který právě zapsal, se znovu otevře. Počet položek se musí rovnat tomu, co bylo připraveno, a pokud se spustitelné soubory dovnitř dostaly a žádný nevyšel ven, je to selhání s příkazem k reprodukci — ne překvapení pro příjemce.
Obnovené kopii stále chybí historie: jeden commit, žádné remotes, žádný reflog. Každá kontrola, která čte víc než pracovní strom, to řekne, místo aby se tiše mýlila.
Profily
| Profil | Pro | Tvar |
|---|---|---|
context | Model, který bude číst repozitář | Každý sledovaný zdroj, bez projekcí z něj generovaných. Výchozí. |
audit | Spuštění vlastních kontrol repozitáře na kopii | Každý sledovaný soubor, nic nevynecháno. Odvozené artefakty se ponechávají právě proto, že kontroly čerstvosti je porovnávají s jejich zdroji. |
chatgpt | Projekt ChatGPT | Zdroje context, bez zaznamenaných měření a výchozích hodnot ratchetu, s vyřazenými artefakty a limity shardů, které projekt ChatGPT indexuje. Sestavuje se jako shardy pomocí majordomus pack; jako zip pomocí majordomus archive chatgpt. |
governance | Předání provozní smlouvy | .ai/, docs/, AGENTS.md, CLAUDE.md. Záměrně žádný kód: odpovídá na to, jaká jsou pravidla, a nedokáže odpovědět, jak jsou implementována. |
majordomus archive --list what there is, and which is the default
majordomus archive --dry-run what would travel, and why the rest would not
majordomus archive the default profile, into tmp/archives/
majordomus archive audit --out /tmp/a.zip
Spuštění kontrol na kopii jsou tři příkazy:
majordomus archive audit --out /tmp/audit.zip
cd /tmp && unzip -q audit.zip && cd <repository>
sh _ARCHIVE/restore.sh && scripts/ci/command-furnishedZdrojový balíček: shardy pro vyhledávání v souborech modelu
Projektové soubory chatového modelu se prohledávají po jednom textovém souboru, každý pod stropem tokenů, a zip se neprohledává vůbec. majordomus pack (příkaz spustitelného souboru v Rustu, pravidlo project.packs-carry-only-sources) zapíše stejný výběr jako shardy Markdownu:
majordomus pack plan chatgpt what would travel, what would not and why, the shards, every finding
majordomus pack build chatgpt write tmp/packs/<repo>-chatgpt-<commit>/ and verify it
majordomus pack verify <dir> verify a written pack again, before an upload
Obsahem jsou bloby git indexu, nikdy pracovní strom, přenesené přesně tak, jak byly commitnuty. Každý soubor je blok: nadpis druhé úrovně, který je jeho cestou, pak oplocený blok o jeden backtick delší než jakákoli řada backticků v souboru. 00-INDEX.md začíná orientation profilu, pak commitem, shardy a vším, co bylo vynecháno; pack.json je manifest, který čte verifikátor, a nemusí se nahrávat.
Kromě toho, co profil vypouští, pack vypouští každý gitlink (vnořený repozitář nebo worktree) a každý soubor, jehož obsah není text UTF-8, a odmítne se sestavit, když vybraný soubor pojmenovává vlastní checkout nebo domovský adresář účtu, který balí, když je jeden soubor nad rozpočtem shardu (shards.max_tokens, počítáno v o200k_base), nebo když shardy a index tvoří víc souborů než shards.max_count. pack verify odmítne shard, jehož digest není digestem manifestu, soubor, který manifest nejmenuje, zakázanou cestu, bajt NUL a soubor nad rozpočtem. Kontrola CI pack-plan plánuje profil chatgpt při každé změně, která jím může pohnout. Postup je dovednost pack-for-chatgpt.
Dva čtenáři profilů se liší v jednom, kolem čehož jsou vzory psány: glob shellu nechá * překročit / a glob exekutoru ne, takže každý vzor v artifact_paths a v profilu chatgpt přichází ve dvojici (target/**, **/target/**), která vybírá stejné cesty pod oběma.
Přidání nebo změna profilu
Repozitář přidává vlastní v archive.yaml pod .ai/repo/, ve stejném tvaru. Profil deklarovaný tam pod id, které nástroj dodává, nahrazuje dodaný celý, místo aby se slučoval pole po poli: napůl přepsaný profil je třetí věc, kterou nepopisuje ani jeden soubor, a žádný z nich by vám pak neřekl, co se chystáte poslat.
Přidání nového je blok v tom souboru a nic jiného — žádný kód, žádný příznak, žádný příkaz case. Nový profil dluží seznam orientation: odstavce, které se na druhém konci stanou _ARCHIVE/README.md. Napište je pro někoho, kdo má strom a žádný kontext, a řekněte, co číst jako první; každý další řádek toho souboru — počty, commit, tabulka toho, co bylo vynecháno a proč — se počítá při pořízení archivu a nesmí se zde zapisovat.
Čím toto není
Není to záloha, artefakt release ani distribuční formát. Nenese historii, není podepsáno a nic to nečte zpět do repozitáře: restore.sh udělá kopii použitelnou tam, kam dorazila, originál nerekonstituuje. Pro release viz DISTRIBUTION.md; pro publikování vlastního obsahu repozitáře viz GITHUB_PAGES_ARCHITECTURE.md.