140. Editory a agenti čtou projekce vrstvy a cargo nic z ní nevkládá
Kontext
Tři provozní briefy (campaigns/majordomus-editor-intelligence-pack, campaigns/majordomus-antigravity-pack, campaigns/majordomus-antigravity-v2) žádají, aby Zed a Google Antigravity četly dovednosti, workflow, pravidla a MCP server tohoto repozitáře z kanonické vrstvy, bez druhého katalogu, bez dotčení osobního nastavení a — ve třetím — s typovanou, obsahově adresovanou derivací a změřeným rozhodnutím, zda by build.rs měl cokoli z toho vkládat. Dne 2026-10-12 nepřistál žádný z prvních dvou: master nenesl .zed/, .agents/ ani koncept editoru a otevřená větev (feature/gemini-is-a-provider, #964) nesla ručně psaný .agents/ vedle generovaného GEMINI.md.
Co produkty čtou, bylo ověřeno proti nainstalovaným releasům, ne podle zadání:
| Zed 1.23.2 | Antigravity 2.22.0 | |
|---|---|---|
| instrukce | první z .rules … AGENTS.md … GEMINI.md | AGENTS.md, GEMINI.md, .agents/rules/*.md (front matter trigger povinný) |
| skills | .agents/skills/<name>/SKILL.md, name a description jsou povinné | stejný adresář; .agents/skills.json může jmenovat další |
| úlohy | .zed/tasks.json, pole {label, command, args, …} | žádné na úrovni projektu |
| MCP | context_servers v .zed/settings.json, potřebuje příkaz, který Zed umí spustit | .agents/mcp_config.json na webu; chybí v průvodci, který dodává 2.22.0 |
| workflow | — | .agents/workflows/ přestane fungovat 2026-10-19 |
Zdroje: zdroj Zed na tagu v1.23.2 (settings_content/src/project.rs, task/src/task_template.rs, prompt_store/src/prompts.rs), zed.dev/docs, text průvodce uvnitř jazykového serveru Antigravity a antigravity.google/docs s jeho changelogem.
Rozhodnutí
Jedna projekce, dva adaptéry. crate::editors čte prostředí — aktivní dovednosti z indexu, veřejné recepty sledovaného justfile — a dva adaptéry je mapují na to, co čte jejich produkt. Kde oba čtou tentýž soubor, zapíše se jednou: každá aktivní dovednost se stane .agents/skills/<id>/SKILL.md, nese name a description, které požadují oba, a odkaz na svou definici, nikdy kopii postupu. Každý veřejný recept bez [confirm] se stane úlohou v .zed/tasks.json, která spouští just <recipe>. Instrukce jsou bootstrap poskytovatele AGENTS.md, který čtou oba a který už vlastní generate providers.
Skrz majordomus generate, ne vedle něj. Projekce je cílem editors stávající pipeline: zapisuje ji majordomus generate editors, porovnává generate --check, indexuje manifest s jejím hashem a slučuje se jako odvozená. Banner dovednosti následuje její front matter a banner seznamu úloh je komentář // (Zed čte .zed/**/*.json jako JSONC); kontrakt artefaktu přijímá přesně tyto dvě formy pro dokumenty pod editors/.
Vlastnictví je banner. Soubor na promítnuté cestě bez něj — nebo dosažený přes symbolický odkaz — je něčí: generate ho odmítne a jmenuje. Projekce dovednosti s bannerem, kterou plán už neobsahuje, patří generátoru a je zastaralá: --check ji nahlásí a generate ji odstraní. generate::write nyní zapisuje přes dočasný sourozenecký soubor a přejmenování a soubor, jehož bajty už jsou správně, nechá nedotčený.
Co není ověřeno, se nezapisuje. Žádný pracovní soubor MCP pro Antigravity, žádné context_servers pro Zed (launcher je relativní cesta, jejíž překlad Zed nedokumentuje), žádné .zed/settings.json (žádná zdejší politika se neliší od výchozích hodnot Zed), žádné .agents/workflows/, žádný režim oprávnění či schvalování. editors.status hlásí každé se stavem podpory (supported, unsupported, unknown, deprecated, requires_user_action), důkazy a tím, co může člověk udělat místo toho.
Sledovaný justfile, ne ten z checkoutu. Kořenový justfile importuje most grafu příkazů, který každý checkout materializuje pod .ai/local/; čten na místě přidá 44 skupin k 5 sledovaným na stroji, který most má, a žádnou na stroji, který ho nemá. Recepty se čtou přes just --dump nad soukromou kopií justfile a .just/*.just, takže commitnutý seznam úloh je stejný na každém stroji i v CI.
Adresy podle obsahu, žádná cache. key každého promítnutého souboru je SHA-256 přes verzi projekce, jeho dokument a cesty a hashe jeho vstupů v pořadí cest — vzorec, který žádá třetí brief a který vysvětluje editors.status. Žádná cache se neukládá: projekce je jeden průchod indexem a jeden just --dump (milisekundy proti indexu, který proces už drží) a pravidlo project.cache-is-invisible žádá, aby cache před ponecháním dokázala bajtovou ekvivalenci. Nic změřeného žádnou nezaslouží.
Žádné vkládání při sestavení. Změřeno v tomto worktree 2026-10-12 (zátěž stroje 7–17): prázdné cargo build 0,21 s; po dotyku .ai/repo/policy.yaml 0,19 s, protože nic pod .ai/ není vstupem sestavení; po dotyku jednoho zdrojového souboru 19,4 s. Vložení libovolného souboru vrstvy přes build.rs by ho muselo deklarovat pomocí rerun-if-changed, čímž by každá úprava dovednosti či pravidla znamenala 19sekundovou rekompilaci cratu kvůli projekci, která za běhu stojí milisekundy — a odpověď binárky by závisela na stromu, ze kterého byla sestavena, ne na stromu, který čte. Stávající build.rs zůstává, jak je; vkládá fakta o sestavení (cíl, profil, commit, generace), k čemuž build skript slouží.
Důsledky
Přidání dovednosti pod .ai/repo/skills/ nebo receptu do justfile změní .agents/skills/ nebo .zed/tasks.json při dalším majordomus generate a generate --check selhává, dokud se tak nestane; neupravuje se žádný adaptér, seznam ani registrace. Release produktu, který mění formát, je změnou jeho modulu adaptéru, jehož hlavička jmenuje release, proti kterému byla jeho tvrzení ověřena. Ručně psaný .agents/ (jako v #964) se nikdy nepřebírá: generate editors se u něj zastaví a editors.status hlásí, co by s ním Antigravity udělal — .agents/skills.json jmenující .ai/repo/skills načte kanonické soubory bez name, které dodaný průvodce vyžaduje, a pravidlo bez platného trigger se zahodí.