Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

Archivace repozitáře

snímky sledovaného stromu, které mohou opustit stroj: co putuje a co ne, proč se generované projekce vynechávají čtením `.gitattributes` místo druhého seznamu, jak se k protistraně dostanou režimy souborů a git index, profily a jak přidat nový

Vykresleno z docs/ARCHIVE.md — stejný Markdown, který ukazuje GitHub.

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:

PojemVýznam
derived: dropZahodit každou cestu, kterou .gitattributes označí merge=derived.
binary: dropVyřadit podle přípony souboru z jednoho seznamu na začátku registru a podle obsahu: co git v indexu posuzuje jako -text.
artifacts: dropZahoď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.txt jako <mode> <size> <path>.
  • _ARCHIVE/restore.sh znovu použije každý režim z toho manifestu a vytvoří git repozitář, jehož jediný commit je tento strom. Je to POSIX sh, 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

ProfilProTvar
contextModel, který bude číst repozitářKaždý sledovaný zdroj, bez projekcí z něj generovaných. Výchozí.
auditSpuštění vlastních kontrol repozitáře na kopiiKaždý sledovaný soubor, nic nevynecháno. Odvozené artefakty se ponechávají právě proto, že kontroly čerstvosti je porovnávají s jejich zdroji.
chatgptProjekt ChatGPTZdroje 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.
governancePř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-furnished

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.

Tvrzení, která tento dokument definuje

Každý odkazuje na vlastní stránku s implementací, testem a místy použití.

Prohledává názvy a popisy všech stránek, které tento web publikuje.