10. Kurátorované znalosti jsou jeden druh s třídou, ne druhé úložiště
Kontext
Vrstva už objevuje vše, co drží, stejným způsobem: .ai/repo/knowledge/sources.yaml jmenuje třídu zdroje, druh a jeden pathspec a majordomus knowledge sources hlásí každý sledovaný soubor, který odpovídá, s třídou, která si jej nárokovala. Politiky, rozsahy, pravidla, rozhodnutí, relace a případy užití přicházejí jedním mechanismem.
Poznámky, které repozitář píše sám o sobě — co číst první, konvence, na které se někdo dohodl, omezení, které nástroje neumějí vyjádřit, lekce, za kterou se jednou zaplatilo — nezapadaly do žádného existujícího druhu a jsou to věci, které projekt průběžně hromadí. Zřejmým tahem bylo druhé úložiště: adresář poznámek s vlastním čtenářem, vlastním front matter a vlastním objevováním, vedený vedle vrstvy, nikoli uvnitř ní.
Otázka, na kterou toto rozhodnutí odpovídá, není, kde poznámky žijí. Je to, zda si nový druh znalosti zaslouží nový mechanismus, nebo zda je to hodnota v poli mechanismu, který už existuje.
Rozhodnutí
Kurátorované znalosti jsou druh knowledge, objevují se třídou zdroje curated jako každý jiný druh a rozdíl mezi faktem, konvencí, omezením, pamětí a lekcí nese povinné pole class uvnitř záznamu.
share/kinds.yaml:192 deklaruje druh: Markdown, povinný front matter, schéma majordomus.knowledge/v1, identita [id]. .ai/repo/knowledge/sources.yaml:108 deklaruje třídu: kind: knowledge, discovery: vcs, pathspec :(glob).ai/repo/knowledge/curated/*.md. share/schemas/majordomus/knowledge/knowledge.v1.schema.json:51 činí class povinným s uzavřeným enumem — fact, convention, constraint, memory, lesson — vedle ostatních povinných polí hlavičky, z nichž status (candidate/verified/superseded) a epistemics (observed/inferred/decided) říkají, jak moc je výroku věřit a odkud pochází.
Nic na kurátorské poznámce není pro čtenáře zvláštní. Její druh uzlu pochází z třídy zdroje, který ji objevil, ne z ničeho v souboru: test/cases/73_knowledge_nodes.sh:91 to tvrdí přesně, proti fixtuře, jejíž tělo mluví o pravidlech, zatímco její třída říká něco jiného.
Zamítnuté alternativy
Druhé úložiště s vlastní čtečkou. Adresář notes/ mimo třídy zdrojů vrstvy, čtený vlastní cestou kódu. Bylo zamítnuto, protože každý konzument, kterého vrstva má, by potřeboval druhou. Objevování je jeden seznam (knowledge sources) a graf se staví nad tím, co seznam vrací, takže úložiště mimo něj je neviditelné pro knowledge nodes, knowledge edges, index, který sestavuje spustitelný soubor Rust, projekce webu odvozené z tohoto indexu a každou kontrolu, která čte cokoli z toho. Cenou není čtečka; je to, že každá z těch věcí získá zvláštní případ a dotaz, který platí pro vrstvu, přestane platit pro repozitář.
Druh na každý typ poznámky — fact, convention, constraint každý jako vlastní druh. Zůstal by jeden mechanismus objevování, ale znásobila by se schémata, z nich generované allow-listy a třídy zdrojů a překlasifikování poznámky by byl přejmenováním plus přesunem, ne úpravou jednoho pole. Typy také sdílejí všechna ostatní pole: lekce a konvence se liší tím, co tvrdí, ne tím, co nesou.
Ponechat řazení implicitní, v próze nebo ve štítcích. Zamítnuto, protože čtenář podle něj nemůže zužovat: knowledge nodes --kind vybírá podle druhu, a když je jeden druh pro všechny kurátorské poznámky, zbývá k výběru třída. Štítek by dělal stejnou práci bez uzavřené množiny a bez schématu, které by odmítlo překlep.
Důsledky
Kurátorská poznámka podléhá celému kontraktu objevování vrstvy, ne jeho koutu. Objevuje se přes index správy verzí, takže nesledovaný soubor není znalost, a prefix :(glob) znamená, že * nikdy nepřekročí oddělovač adresáře — test/cases/64_knowledge_discovery.sh:73 tvrdí, že žádný soubor nenajdou dvě třídy, byl napsán poté, co vypuštění tohoto prefixu způsobilo, že každá předávka pod .ai/local/ dorazila jako sdílená znalost repozitáře.
Třída je uzavřený enum, takže přidání šestého druhu poznámky je změna schématu s přegenerovaným seznamem povolených (share/allow/knowledge.txt, generovaným z téhož schématu pomocí majordomus generate), ne nový adresář. To je zamýšlené tření: cena nového druhu je jedno posouzení, zda ho pět stávajících opravdu neunese.
Každé pole, které kurátorská poznámka nese, vrstva už rozumí — provenance.origin a provenance.derived_from s typovanými odkazy, které se musí vyřešit, a relations s vlastními typy relací vrstvy — takže poznámka se účastní grafu znalostí, místo aby vedle něj ležela, a poznámka citující soubor, který už neexistuje, je nálezem téže kontroly, která posuzuje odkazy každého jiného záznamu.
Tím se vylučuje schéma na druh: omezení nemůže vyrůst o pole, které lekce nemá, aniž by je získal jako volitelné každý záznam znalostí. Kde druh potřebuje vlastní tvar, je to důkaz, že jde o jiný druh, a otázka se vrací k share/kinds.yaml.
Jednu mezeru stojí za to pojmenovat otevřeně, protože vlastní smlouva rozhodnutí naznačuje víc vynucování, než strom má. Schéma deklaruje class jako povinné a vygenerovaný seznam povolených odmítne neznámý klíč — ale záznam s chybějícím klíčem je přesto majordomus knowledge nodes hlášen jako uzel, protože čtenář bere druh uzlu z třídy zdroje. Takže „každá kurátorovaná poznámka deklaruje svou třídu“ je dnes vlastnost dvou existujících záznamů, nikoli něco, co drží kontrola.