Toto je záznam o tom, jak byl DESIGN.md odvozen. Existuje proto, aby každé designové rozhodnutí šlo vystopovat k pozorovanému selhání nebo pozorovanému úspěchu a aby čtenář viděl, co bylo zvažováno a zamítnuto, nejen co bylo ponecháno.
Zdrojovým materiálem bylo velké soukromé inženýrské prostředí: instrukční soubory napříč zhruba dvaceti repozitáři, jeden velmi velký monorepozitář se zralým korpusem politik a háčků, několik let poznámek z relací a retrospektiv a čtyři dřívější pokusy o dozorový nástroj. Nic z toho materiálu se zde nereprodukuje. Cesty, jména, citace a interní slovník byly odstraněny. Řádové velikosti zůstávají, protože jsou důkazem.
Metoda: prostudovat → abstrahovat → zpochybnit → syntetizovat. Ne kopírovat → přejmenovat → publikovat.
1. Definice produktu
Prismatic Majordomus je lehká řídicí dozorová vrstva pro práci asistovanou AI. Drží jednu kanonickou politiku, promítá ji do jakéhokoli formátu instrukcí, který čte každý AI pracovník, drží trvalý stav úloh mimo každou konverzaci, koordinuje rozsah mezi souběžnými pracovníky a odmítá označit práci za dokončenou, dokud není splněn kontrakt dokončení.
Není to model, framework pro agenty ani runtime. Dohlíží na pracovníky; nespouští je.
Jedna věta: AI pracovníci by neměli řídit sami sebe.
2. Jediná kořenová příčina
Každé vlákno extrakce konvergovalo k jednomu zjištění a to se uvádí první, protože zbytek návrhu je jeho důsledek.
Vynucování se deklaruje v próze a nikdy se neusmiřuje s tím, co skutečně běží.
Nezávislé instance nalezené ve zdrojovém materiálu, každá ověřena čtením zapojení, ne dokumentace:
| # | Deklarováno | Skutečnost |
|---|---|---|
| 1 | 39 pre-commit skriptů, README popisující záložní dispečerskou smyčku | dispečer natvrdo 5; 34 osiřelých; žádná smyčka neexistuje |
| 2 | dva hooky ochrany worktree, front matter politiky čte BLOCKING | nikdy se nedispečuje; jejich samotest je echo OK; exit 0 |
| 3 | hák názvové konvence „vynucovaný od“ určitého data | měsíce nezapojeno; pak zapojeno s chybou příznaku, která na každé platformě odpovídala nula souborům |
| 4 | katalog 546 AI agentů uváděný jako hlavní schopnost | 1 ze 183 vzorkovaných záznamů se skutečně zaregistrovalo v runtime |
| 5 | 7 runtime hooků pod konfiguračním adresářem nástroje | žádný soubor nastavení v repozitáři neměl klíč hooks |
| 6 | dobře navržený commitový hlídač se self-testem a zdůvodněním | registrace se ztratila, když nesouvisející nástroje přepsaly soubor nastavení; hook, testy i dokumentace stále existují |
| 7 | guvernér rozpočtu volání nástrojů (omezení čtení, strop subagentů, zhuštění výstupu) | nainstalováno, nikdy neregistrováno, adresář stavu prázdný |
| 8 | guard relace s detekcí driftu podle digestů | běželo jeden den; 18 stavových souborů; od té doby nic |
| 9 | dvě auditní knihy předepsané smlouvou o vynucování | nikdy nevytvořeno |
| 10 | konfigurační soubor chráněných větví čtený validátorem přepsání | neexistuje |
| 11 | kompresní modul s bajtově přesnou validační tabulkou, „Production Ready“ | modul neexistuje |
| 12 | předchozí pokus o extrakci tvrdící 106 artefaktů | dodáno 2 |
| 13 | registr tvrzení hlásící „100 % ověřeno, nula porušení“ | baseline soubor o adresář dál zaznamenává 27,263 |
| 14 | pilíř doktríny s modulem, politikou a háčkem | nezaregistrováno v žádném seznamu pilířů; nikdy nespuštěno |
| 15 | volba časového limitu procesu u volání runtime | funkce takovou volbu nemá; záchranná větev je mrtvý kód |
| 16 | pět skriptů uvedených jako doporučený onboardingový workflow | žádné neexistují |
| 17 | příznak rozsahu --changed u úlohy CI | vypočítá seznam, vytiskne ho a přesto běží bez rozsahu |
Sedmnáct není vyčerpávající. Je to počet, při němž přestalo být zajímavé vzor dál rozšiřovat.
Důsledek pro návrh: hlavní deterministickou zárukou doctor je, že každé vynucování, které politika deklaruje, se vyřeší na artefakt, který existuje, je spustitelný a je dosažitelný z pojmenovaného dispečera. Ta kontrola má zhruba šedesát řádků. Zdrojové prostředí ji popsalo na pěti místech a neimplementovalo ji nikde.
3. Ledger vzorů
Sloupce: Proven znamená pozorováno, že funguje v produkci, nejen navrženo. Generalizable znamená použitelné běžným týmem s gitem a shellem, bez jiného runtime. Complexity je odhad pro implementaci v přenosném shellu.
| Vzor | Problém, který řeší | Důkazy | Prokázáno | Zobecnitelné | Složitost | Zahrnout |
|---|---|---|---|---|---|---|
| Sesouhlasení zapojení vynucování | kontroly deklarované, ale nezapojené | 17 instancí výše | ne — nikdy nesestaveno | ano | ~60 řádků | ano, jádro |
| Identita odvozená z gitu na záznamech stavu | workeři si halucinují větev/hlavní commit | zapisovač předávek zakazuje autorskou identitu; resolver validuje | ano | ano | nízká | ano |
Štítek divergence při čtení (exact/advanced/diverged/different_context) | zastaralý stav, kterému se mlčky věří | resolver předávek přes merge-base | ano | ano | nízká | ano |
| Obnova v rozsahu, nikdy záložní řešení pro celý repozitář | nesouvisející poznámka prosakuje do kontextu | úrovně resolveru; nepřítomnost končí exit 0 | ano | ano | nízká | ano |
| Předávka jen s připojováním, atomická, nikdy nestagovaná | přepsaný nebo automaticky commitnutý stav | publikace hardlinkem s opakováním | ano | ano | nízká | ano |
| Povinné sekce předávky vynucené při zápisu | prázdné záznamy pokračování | kontrola sekcí awkem odmítá zápis | ano | ano | nízká | ano |
| Rozpočet vždy načítaného s selhávající kontrolou + integrita ukazatelů | kontrakt vyrostl z 0 na 1 100 řádků během 200 úprav | limit 200 řádků drží na 49; nelimitovaný sourozenec znovu vyrostl 3,6× | ano | ano | nízká | ano |
| „Unscoped rule is always-loaded context“ | skrytý růst kontextu | označil to řádek lintru | ano | ano | triviální | ano |
| Počty se počítají, nikdy nepíšou | pět protichůdných počtů aplikací, tři počty agentů, pět počtů pilířů napříč autoritativními soubory | validátor existuje a přesto našel 15 nesrovnalostí | částečně | ano | nízká | ano |
| Oddělené osy: model / úsilí / upovídanost / kontext / verifikace | „Sonnet with Reasoning“ považován za model | současná rubrika odděluje model a effort; verbosity chybí všude | ano (2 osy) | ano | triviální | ano, rozšířeno |
| Úsilí jako delta od výchozího | rozrůstání profilů | „nastavit jen tam, kde se liší“ | ano | ano | triviální | ano |
| Pojmenovaný profil provádění, který svazuje osy | žádný takový balík neexistoval | governor rozpočtu měl implicitní nepojmenovaný profil s alarmy driftu | ne | ano | nízká | ano |
| Typované výsledky (uzavřený slovník) | no_match vs failed v próze nerozlišitelné | 157 z 298 poznámek neslo volnotextový stav; čtyři nekonzistentní enumy | ne | ano | triviální | ano |
| Count-ratchet (baseline o jednom celém čísle; zvýšení selže; chybějící baseline varuje) | starý nepořádek blokuje všechny, nebo je zamaskován allowlistem | čtyři živé rohatky; absolutní kontroly narazily na 1 400 nálezů a byly povoleny na 8 | ano | ano | ~40 řádků/metrika | ano |
| Pevná nula pro katastrofické třídy, nikdy ratchet | ratchet připouští nejhorší instanci | rozhodovací matice ve zdroji | ano | ano | triviální | ano |
| Kontrakt exit kódů; žádné „varovat a pokračovat“ | hooky fail-open | smlouva to uvádí; skener zachytí || true | ano | ano | triviální | ano |
| Trailer dokazuje autorství, nikdy že kontrola proběhla | značky v commit zprávách přijímané jako důkaz | postmortem ve zdroji | ano | ano | policy | ano |
| Vstupy autorizace odvozené nebo potvrzené, nikdy ambientní | override validátor poražený proměnnými prostředí | postmortem ve zdroji | ano | ano | nízká | ano |
| Sebevypínací únikový východ bootstrapu | dodání kontroly do repozitáře, který je starší než ona | jeden záznam, zpracovaný tak, jak byl navržen | ano | ano | ~10 řádků | ano |
| Normalizace tvrzení + zahrnutí v obou směrech | překryvy s lomítkem na konci a podstromů nejsou detekovány | živý registr ukazuje obě třídy | ne — bylo porušeno | ano | nízká | ano |
| Překryv na dotčených souborech, ne na deklaracích | 3 200 kolizí neviditelných pro kontroly deklarací | forenzní matice kolizí | ne | ano | nízká | ano |
Tvrzení sloučeno do start, není volitelné | 10 z 18 worktrees mělo prázdné claimy | audit souladu | ne | ano | triviální | ano |
| Registr znovu sestavitelný z gitu | 82 % zastaralých záznamů registru při jednom auditu | opravný příkaz existoval | částečně | ano | nízká | ano |
| Strop uchování u úložišť jen pro připisování | 10 GB nepřečtených snímků metrik | žádný neexistoval | ne | ano | triviální | ano |
| Nástroj aplikuje své vlastní kontroly sám na sebe | linter proti rozrůstání na 500 řádků zchátral za 19 dní | regrese změřena | ne | ano | policy | ano |
| Publikovaný seznam „záměrně chybí“ | čtenáři předpokládají, že vynechání jsou přehlédnutí | toto udělalo jedno README protokolu | ano | ano | próza | ano |
| Reprodukční příkaz u každého nálezu | audity obsahovaly nepravdivá tvrzení, zachycená až druhým čtenářem | více | ne | ano | policy | ano |
| Sémantická kondenzace výstupu (head + diagnostické řádky + tail, s vlastním razítkem) | příliš velký výstup nástroje | implementace governoru | ano, stručně | specifické pro poskytovatele | nízká | odloženo na v0.2 |
| Omezení velikosti čtení na hranici nástroje | worker pohltí soubor o 5000 řádcích | implementace governoru | ano, stručně | specifické pro poskytovatele | triviální | odloženo na v0.2 |
| Rozpočet počtu subagentů | náklady na rozvětvení | governor to globálně nastavil na 1; během dnů vráceno | ano, a pak odmítnuto | ano, je-li odvozeno z úlohy | nízká | odloženo na v0.2 |
| Telemetrie vyloučení při balení kontextu | nedostatečně naplněný kontext nelze ladit | manifest packeru | ano | ano | nízká | odloženo |
| Značky shody jako omezené vyhledatelné výjimky | neviditelná potlačení | konvence ve zdroji; jedna značka zdokumentována jako nefunkční | částečně | ano | nízká | odloženo |
| Hrany závislostí úloh | — | jeden demo soubor, podúlohy čekající o rok později | ne | nejasné | střední | zamítnuto v0.1 |
| Směrování podle popisu se spouštěcími frázemi | volba postupů | funguje ve zdrojích | ano | specifické pro nástroj | — | pouze záležitost projekce |
4. Zamítnuté vzory
Rovnou zamítnuto, se selháním, které zamítnutí ospravedlňuje:
| Zamítnuto | Proč |
|---|---|
| Pojmenovaní agenti, persony, role, úrovně, velitelé, registry | 546 položek; 305 bylo pojmenovacích variant bez funkčního rozdílu; 139 bylo zástupných, jejichž schopnosti se rovnaly jejich odpovědnostem; 109 byly slajdy z pitch decku. Dozorový nástroj, který přidává podstatná jména, se stává tím, na co dohlíží. |
| Poradní úroveň, která se nazývá vynucováním | Každá poradní úroveň zdegenerovala v dekoraci. Dvouúrovňové „advisory/blocking“ bylo zdokumentováno a neexistovalo. |
| Uzavřený výčet pro identitu workera | Enum o 8 hodnotách použitý jen k sestavení názvů souborů, nevalidovaný při čtení, již porušený ve vlastním živém registru. |
| Ručně udržovaný dispatcher s číselnými prefixy, které vypadají smysluplně | 5 z 39 vyvoláno; pořadí bylo dekorativní; chmod -x tiše odstranilo kontrolu. |
Vzor guardu fail-open if [ -x hook ]; then hook; fi | Chybějící bit spustitelnosti smaže kontrolu bez chyby. Správný tvar blokuje s pokynem k obnovení. |
| Vlastnění mergi | Zdrojová implementace po rebase vynuceně přesunula cílovou větev, zahodila nepushnuté commity, bez tvrzení o původu. |
| Přibalený runner kontrol kvality uvnitř koordinačního nástroje | Duplicitní logika CI; audit zdroje doporučil ji sloučit. Volat nakonfigurovaný příkaz verify. |
| Globální konstantní rozpočty (subagenti = 1, vždy haiku) | Vráceno zpět během dnů. Rozpočty musí být odvozeny z úlohy, jinak je člověk governor vypne a nic se neměří. |
| Tichá mutace vstupu nástroje pracovníka | Pro workera neviditelné; drift by se měl ukázat dřív, než se vynutí. |
| Bajty ÷ 4 označené jako počet tokenů | V manifestu k nerozeznání od měření. Odhady jsou označeny a vyloučeny z vynucování. |
| Zdokumentované metriky bez producenta | Kompresní subsystém s bajtově přesnými procenty retence pro kód, který nikdy nebyl napsán. Nástroj odmítá zobrazit metriku bez producenta. |
| Více překrývajících se úložišť stavu | Čtyři koexistující jmenné prostory vyžadovaly tabulku pro rozlišení. Dodejte jedno úložiště. |
| Ručně psaný serializér omezeného JSON v shellu | Správné jen proto, že zapisovač odmítl escapování; stálo to chybu v klíči řazení, past přenositelnosti regexu a díru v trvanlivosti. Použijte skutečný serializér. |
| Pozůstatková pole schématu | Čtyři vždy-null pole směrování převzatá z dřívějšího systému. Každé pole se buď zapisuje a čte, nebo se odstraní. |
| Minimální rozvětvení / minimální počet agentů | 44 procedur bylo označeno jako selhané, pokud nespustily 3–6 agentů, což zatěžovalo i triviální. |
| Přejmenování přijato jako oprava | Migrace se přistihla, že mechanicky přejmenovává doktrínu, a vrátila se. Pokud lze kontrolu splnit hledáním a nahrazením, není to kontrola. |
| Mytologický slovník | 2 850 souborů stále neslo zakázané formulace rok po příkazu k odstranění. Jen běžný technický jazyk. |
| Neohraničené adresáře poznámek relací | 10 GB, 1 496 souborů, ruční runbook obnovy na patnáct až třicet minut. |
| Jakýkoli démon, server, databáze, fronta, povrch MCP, monitor na pozadí, vektorové úložiště | Žádný důkaz, že některý z nich vyřešil problém, který mechanismy založené na souborech nevyřešily. Čtečka stdio MCP přidaná později v apps/majordomus-cli/ není žádný z nich: žádný proces nepřežije svého klienta, žádný stav nepřežije proces; viz .ai/repo/adrs/0001-rust-cli-and-stdio-mcp.md. |
5. Navrhovaný strom souborů
.
├── README.md
├── LICENSE
├── SECURITY.md
├── CONTRIBUTING.md
├── AGENTS.md # canonical AI-readable contract for this repo
├── CLAUDE.md # pointer to AGENTS.md until `update` generates it
│
├── bin/
│ └── majordomus # single portable-shell entry point
│
├── lib/ # sourced shell modules, one per subcommand
│ ├── common.sh
│ ├── doctor.sh
│ ├── start.sh
│ ├── check.sh
│ ├── watch.sh
│ ├── update.sh
│ ├── handover.sh
│ └── finish.sh
│
├── share/
│ ├── skeleton/ # what `init` copies into a project's .majordomus/
│ │ ├── policy.yaml
│ │ ├── profiles/ # routine · implementation · debugging · deep-work
│ │ ├── templates/ # handover, completion, decisions, open-questions
│ │ └── providers/ # body.md + one wrapper template per provider
│ └── allow/ # key allowlists: unknown keys are errors
│
├── .majordomus/ # this repository supervising itself
├── .githooks/ # pre-commit runs doctor, pre-push runs finish --check
│
├── test/
│ ├── run.sh
│ └── cases/ # one script per behaviour, disposable repo each
│
├── examples/
│ └── minimal/ # a scratch repo walked through start → finish
│
└── docs/
├── README.md # index
├── DESIGN.md # specification
├── CLI.md # commands, exit codes, target output
├── SCHEMAS.md # every file, with a concrete example
└── EXTRACTION_REPORT.md # this document
Odstraněno z původního návrhu: principles/ (splývá s policy.yaml a README), workflows/ (lifecycle je CLI; adresář workflows by byl druhým popisem téhož), vějíř scripts/majordomus-* spustitelných souborů (jeden vstupní bod, sourcované moduly). Nic se nezachovalo jen proto, že to prompt navrhl.
6. Kanonické pojmy
Běžný inženýrský slovník. Žádný soud.
| Pojem | Význam |
|---|---|
| policy | jediný kanonický soubor YAML; nezávislý na poskytovateli |
| profil | pojmenovaný balík, který pro třídu úloh fixuje úsilí, upovídanost, přepínače kontextu, ověřování a výstupní kontrakt |
| projekce | instrukční soubor specifický pro poskytovatele, generovaný z politiky; opatřený otiskem |
| úloha | jediná aktivní jednotka práce; state/current.yaml |
| scope | normalizovaná množina cest, kterých se úloha smí dotknout |
| claim | rozsah zaznamenaný pro detekci překryvu; součást start |
| kontrolní bod | aktualizace current.yaml; zastarání se měří od poslední |
| handover | záznam o pokračování jen s přidáváním a povinnými sekcemi |
| výsledek | jedno z completed / partial / blocked / no_match / failed |
| kontrakt příkazu finish | kontrolní seznam, který finish vyhodnotí před přijetím completed |
| kniha záznamů | state/ledger.jsonl, jen přidávání, omezená retence, zapisuje pouze Majordomus |
| ratchet | baseline o jednom celém čísle, které smí klesnout, ale ne vzrůst |
| zapojeno | vynucení, jehož artefakt existuje, je spustitelný a dosažitelný ze svého dispatcheru |
| drift | jakýkoli deterministický rozpor mezi politikou, projekcí, stavem a gitem |
7. Hranice MVP
v0.1 umí: držet kanonickou politiku; definovat čtyři profily; spustit úlohu s rozsahem a normalizovaným tvrzením; uchovávat trvalý stav s identitou odvozenou z gitu; označit zastaralost stavu při čtení; zapisovat a rozřešit předávky; vyhodnotit kontrakt dokončení; detekovat třídy driftu v návrhu; generovat projekce s otiskem pro čtyři poskytovatele; prokázat, že jeho vlastní vynucování je zapojeno; běžet zcela offline v přenosném shellu.
v0.1 neumí: vyvolat model; měřit tokeny či cenu; dynamicky směrovat; hookovat runtime pracovníka; spouštět cokoli na pozadí; koordinovat napříč stroji; reprezentovat závislosti úloh.
Hranice je v README uvedena se stejnou důležitostí pro obě poloviny.
8. Audit extrakce / důvěrnosti
Provádí se nad obsahem tohoto repozitáře před každým pushem.
- Neobjevují se žádné interní cesty, názvy hostitelů, URL, identifikátory zákazníků či případů ani tajemství. Zkontrolováno grepem na názvy adresářů zdrojového prostředí, vzory hostitelů a slovník; nula zásahů.
- Neobjevuje se žádná citace ze soukromého materiálu. Hlásí se řády; věty ne.
- Slovník doktríny zdrojového prostředí (názvy pilířů, zkratky, divadelní štítky) se nevyskytuje.
- Jediná odkazovaná značka je „Prismatic“ v názvu produktu a v jednosměrném prohlášení o původu.
- Pracovní ledger použitý při extrakci žije v dočasném adresáři relace mimo tento repozitář a necommituje se.
- Směr závislosti: žádný. Tento repozitář nic neimportuje a na nic ve zdrojovém prostředí neodkazuje.
9. Rizika
| Riziko | Zmírnění v návrhu |
|---|---|
| Samotný Majordomus chátrá jako čtyři nástroje před ním | doctor nejprve běží proti vlastní instalaci; každá kontrola má příkaz k reprodukci; README uvádí, co je zaručeno a co jen pozorováno |
| Limity přenositelného shellu (macOS dodává bash 3.2; BSD awk a sed se liší) | žádná asociativní pole, žádné mapfile, žádné přepínače jen pro GNU; testováno na obou; YAML zpracovává malá závislost s zdokumentovaným záložním řešením |
| Parsování YAML v shellu je křehké | v0.1 omezuje schéma politiky na plochou, parsovatelnou podmnožinu a validuje ji; skutečný parser se používá tam, kde je dostupný |
| Projekce se upravují ručně | otisky to činí viditelným jedním příkazem; generovaná hlavička pojmenovává příkaz regenerace |
Uživatelé přeskočí start a pracují bez dohledu | check a finish odmítnou bez current.yaml; promítnuté instrukce říkají workeru, aby spustil start |
| Přílišné blokování plodí kulturu obcházení | blokování je omezeno na levné, deterministické, samozřejmě správné kontroly; vše o rozpracované práci se hlásí, neblokuje |
| Nabobtnání rozsahu během implementace | seznam „záměrně chybí“ je veřejný závazek; revize další fáze se u každé odpovědnosti ptá, zda je zdokumentovaná / reprezentovaná / validovatelná / vynucovaná / měřitelná, a nezaměňuje první s poslední |
| Dva souběžní AI zapisovatelé v jednom checkoutu, což by podle návrhu měly být dva worktree | Pozorováno při sestavování samotného v0.1: CLI a odvozený web psaly dvě relace v jedné pracovní kopii. Fungovalo to, protože rozsahy byly disjunktní podle adresáře a obě strany si je navzájem deklarovaly dřív, než se čehokoli dotkly, což je krok nároku, který návrh činí povinným. Nástroj to na checkoutu, ve kterém žije, zatím vynutit neumí; start druhou úlohu odmítne, takže druhý zapisovatel je prostě nespustil. Zaznamenáno jako omezení, ne skryto. Čistší příklad ze stejného večera: generátor webu byl správný vůči základní URL, vůči které se ve skutečnosti nikdy nevyřešil, takže každý asset po nasazení pod cestou repozitáře vracel 404 a žádný zapisovatel to sám zachytit nemohl; stačil jeden snímek obrazovky z jedné strany a jedna oprava z druhé a oprava se dodala s kontrolou, která selže na jakékoli cestě bez prefixu. To je vlastní pravidlo repozitáře použité na sebe: žádné tvrzení bez spustitelné opory |
| Značka vybízí číst ji jako výřez ze zdrojové platformy | prohlášení o původu je jednosměrné a výslovné; nesdílí se žádný kód |
10. Doporučený plán implementace
Pět fází, každá podmíněná realitou té předchozí, žádná nezačne dřív, než je předchozí zrevidována.
- Návrh — tento dokument a
DESIGN.md. Dokončeno. - Implementovat v0.1 — hotovo; viz
CLI.md,SCHEMAS.md,test/cases/. Původní zadání: — strom souborů výše; behaviorální testy v jednorázových repozitářích pro: šťastnou cestu init, chybějící politiku, neplatné YAML, neznámý klíč, chybějící rozsah, nedokončenou úlohu, platné dokončení, zápis a rozlišení předávky, odmítnutí přepsání, každou třídu odchylky a zdravý případ bez zjištění. Každé tvrzení README se porovná s implementací dřív, než se fáze uzavře. - Udělat dozor skutečným — pro každou odpovědnost poctivě odpovědět dokumentováno / reprezentováno / validovatelné / vynucováno / měřitelné; uzavřít nejhodnotnější mezery v tomto pořadí: integrita stavu, integrita politiky, detekce driftu, integrita životního cyklu, integrita předávek, drift projekcí, viditelnost rozpočtu, viditelnost koordinace. Vytvořit dokument modelu dozoru, který odděluje zaručené od pozorovaného.
- Nepřátelské posouzení — matice tvrzení/implementace; pokus smazat 30 % repozitáře; desetiminutový průchod novým uživatelem; sken čisté extrakce včetně historie gitu; audit bezpečnosti a přenositelnosti; audit terminologie. Vrací READY nebo NOT READY s blokátory.
- Release — až po READY. Šablonový repozitář, minimální CI,
v0.1.0, poznámky k release bez nafukování, vzdálená validace včetně čerstvého repozitáře vygenerovaného ze šablony.
Fáze 3 je další akce.
11. Druhý průchod — záznamy relací a kompilátor znalostí
První průchod zkoumal instrukční soubory, hooky, úložiště stavu a koordinaci. Nezkoumal dva podsystémy, které se ukazují jako důležité pro tentýž problém: souborovou disciplínu poznámek relace a bezstavový kompilátor Markdownu, který z vlastních dokumentů repozitáře vytvářel procházitelný generovaný trezor poznámek.
Byly znovu prozkoumány, když se plánovalo M003. Metoda je nezměněná — studovat, abstrahovat, zpochybnit, syntetizovat — a stejně tak pravidlo důvěrnosti: hlásí se mechanismy a řádové velikosti, nikoli kód a slovník.
Oba jsou velmi rozdílné kvality a ten rozdíl je sám zjištěním. Disciplína poznámek relace je tvarovaná podle názvu souboru: vynucuje jmennou gramatiku a nemá model toho, co záznam obsahuje. Kompilátor je postaven pořádně a téměř každá jeho pojistka nese komentář, který pojmenovává selhání, jemuž brání.
Co říkají důkazy
| Pozorování | Velikost | Důsledek pro tento návrh |
|---|---|---|
| Adresář poznámek relací s deklarovanou retencí „posledních 50 souborů“ | zhruba 10 GB napříč 585 položkami při tomto průchodu; oddíl 4 zaznamenává 1 496 souborů při prvním průchodu a obojí se ponechává, ne usmiřuje — počet se změnil, objem ne | Nadměrný růst nebyl selháním retence. Druhý producent zapisoval snapshoty, které nebyly Markdown, do adresáře, v němž každý nástroj filtroval podle jedné přípony, takže se nepoužil žádný práh a žádný audit je neviděl. Retence musí být vlastností úložiště, ne vzoru souboru. |
| Jeho záznamy | volný text od začátku do konce; počet strojově kontrolovatelných polí nula, včetně pole identifikátoru označeného jako auto-generated, které nic negenerovalo | Záznam, který tvrdí hash commitu, jejž nikdo nespočítal, je horší než žádný záznam. Každé identifikační pole relace Majordomus se počítá z gitu a v psaném těle se odmítá. |
| Jeho krok „komprese“ | nahradil originál na místě digestem odvozeným z grep, přičemž jedinou plnou kopii ponechal nesledovanou | Majordomus archivuje a nikdy nepřepisuje. Nic záznam neshrnuje, protože nic zde nevolá model a regexový digest je ztrátový model s horšími způsoby selhání. |
| Výběr souborů tohoto kroku | pevně zadaný prefix roku, který přestal sedět, když se rok změnil; skončí a hlásí úspěch, aniž by cokoli udělal | Udržovací příkaz, který nemůže nic udělat a ohlásí úspěch, se nedá odlišit od takového, který funguje. |
| Jeho řazení a výběr | soubory vybrané podle mtime souborového systému, pak seskupené podle data vyparsovaného z názvu souboru | Dvoje hodiny v jedné smyčce a mtime klon nepřežije. Majordomus řadí podle zaznamenaného časového razítka a shody rozhoduje knihou. |
| Jeho vynucovací háček | dokumentováno jako blokující; na každé platformě tiše nic nenašlo, protože vstup oddělený NUL byl poslán do řádkově orientovaného filtru | Táž třída selhání, kterou první průchod našel sedmnáctkrát, nalezená znovu v subsystému, který měl tomu zabránit. |
| Jeho čísla retence | čtyři dvojice cíl a práh pro jednu datovou sadu, rozptýlené v politice, README a dvou skriptech, žádná nesladěná, žádná s uvedeným odvozením | Retence je jeden blok politiky, čtený jedním příkazem. |
| Jeho procento shody | vyňaté soubory započítané do jmenovatele | Číslo, které soustavně podhodnocuje to, co má hlásit. |
| Zjišťování kompilátoru | řízeno git ls-files; poslední zaznamenaný běh klasifikoval 25 539 sledovaných souborů Markdown na 3 655 kurátorovaných, 2 662 logů relací a 19 222 vyloučených | Pravda repozitáře, žádné vylučovací globy k údržbě, žádný výstup buildu, žádné nesledované soubory. Přijato přímo. |
| Hrany kompilátoru | 7 731 hran, každá explicitní, žádná odvozená | Graf zná jen to, co někdo napsal. To je vlastnost, kterou stojí za to mít jako první. |
| Jeho rozbité odkazy a osiřelé stránky | zhruba třetina jeho uzlů | Hlášeno, nikdy neblokuje, s zaznamenaným zdůvodněním: blokování podle počtu, který je z principu velký, učí lidi selhání ignorovat. |
| Jeho studený běh | asi 2,1 sekundy nad 3 655 zdroji, přičemž manifest zkratuje vykreslování, ale ne analýzu | Manifest, který jen přeskakuje zápisy, má mnohem menší cenu než ten, který přeskakuje práci. Měřte, než uvěříte. |
Adoptováno, přeodvozením
Každá z nich je nápad, znovu implementovaný od základu v přenosném shellu a awk proti vlastním záznamům Majordomus. Žádný kód, schéma ani slovník nebyl převzat.
| Nápad | Čím se to zde stane |
|---|---|
| Identita ze stabilního zdrojového faktu; hashe jen pro detekci změn | Id uzlu je kanonické id nebo cesta v repozitáři. source_hash říká, zda se pohnul, nikdy co to je. |
| Provenience vyžadována na každé hraně | Hrana nese soubor, v němž byla pozorována, a hrana bez něj je selhání validace, a ne tiché zahození. |
| Slovník jistoty, jehož hodnota „inferred“ je zatím nepoužita | Důvěryhodnost grafu se stane ověřitelným tvrzením: počet odvozených hran je nula a příkaz to říká. |
| Klasifikovat ze struktury a deklarovaných metadat, nikdy z prózy | Druh uzlu pochází z jeho zdrojové třídy nebo explicitního pole. Dokument obsahující slovo „roadmap“ se roadmapou nestává. |
unknown jako plnohodnotná odpověď | Nerozpoznaný zdroj je uzel druhu unknown, je hlášen, nehádá se a nezahazuje. |
| Nikdy nenastavovat stav na věrohodnou hodnotu | Už je to pravidlo pro stav úkolu, který se odvozuje a nemá uložené pole. Rozšířeno na druh uzlu. |
| Kontrolovat jen vady, které způsobil tento běh | Rozbitý odkaz mezi dvěma věcmi, které Majordomus vlastní, je selhání. Odkaz na záměrně externí zdroj ne. |
| Chybějící neznamená poškozené | Chybějící manifest je první běh. Manifest, který se nepodaří parsovat, selže hlasitě, protože jeho považování za chybějící by potichu vypnulo záruku, kvůli které existuje. |
| Označit odkaz syntaxí, ve které byl napsán, ne tvarem jeho cíle | Relativní odkaz bez přípony je odkazem kvůli tomu, jak byl napsán. |
| Před hledáním odkazů odstranit ohraničený kód | Cesta uvnitř ukázky kódu je příklad, ne odkaz. |
| Řešení kolizí nezávislé na pořadí, podložené hashem | Čitelný fragment je nápověda; hash je záruka. |
| Zaznamenejte obě hodnoty, když se dva zdroje jednoho faktu neshodují | Ohlásit drift, místo aby se vybral vítěz a skryl se. |
| Selhání jednoho souboru je chyba, ne přerušený běh | Jeden vadný vstup nesmí stát sestavení. |
| Seřazený, deduplikovaný generovaný výstup | Artefakt lze porovnat diffem, takže dopad přestavby lze zrevidovat. |
| Promítnout korpus s vysokým objemem a nízkou trvanlivostí jako jeden index | Na checkpointy se odkazuje z jejich relace, nedělá se z nich po jednom uzlu. |
| Časová razítka UTC v názvu souboru pro chronologické záznamy | Už zde tvar checkpointu a předávky, a už nese poddenní rozlišení a složku jedinečnosti, které zkoumané gramatice chyběly. |
| Přeskočit těžký runtime, když ho job nepotřebuje | Už platí z konstrukce: není žádný runtime, který by šlo přeskočit. |
Odmítnuto
| Odmítnuto | Proč |
|---|---|
| Libovolná databáze — vestavěná, relační, sloupcová nebo grafová | Korpus je několik tisíc malých souborů. Databáze je závislost, příběh migrace a druhý zdroj pravdy, koupený dřív, než cokoli změřilo potřebu. Nejdřív měřit. |
| Embeddingy, vektorové vyhledávání, podobnost, shlukování, automatická taxonomie | Žádný nedokáže jmenovat řádek, který vztah ospravedlňuje, což je test, který nyní používá hranice extrakce. Jsou také nevyvratitelné tím, kdo je nejlépe postaven k tomu, aby si všiml, že jsou špatně. |
| Jakékoli generované shrnutí relace, modelem nebo regexem | Majordomus nevolá žádný model a studovaný regex digest je případová studie toho, proč je levná náhrada horší. Worker si napíše vlastní shrnutí, jinak ho záznam nemá. |
| Renderer pro vault poznámek a jakákoli závislost na konkrétní aplikaci pro poznámky | Graf je nezávislý na rendereru. Renderer lze přidat později nad stejná generovaná data; nic v jádru nesmí žádný předpokládat. |
| Kopírování těl záznamů do poznámky relace | Jediná nejdůsledněji škodlivá vada zkoumaného úložiště relací. Relace je obálka odkazů. |
| Měnitelný soubor relace, na který ostatní příkazy při běhu připojují odkazy | Staví zápis na horkou cestu každého příkazu a znovu vytváří druhé úložiště. Obálka se odvozuje z účetní knihy při uzavření. |
| Destruktivní komprese nebo přepis na místě jakéhokoli záznamu | Archivace přesouvá; nikdy nepřepisuje a nikdy nepřepíše archiv. |
| Čas změny souboru (mtime) jako vstup řazení nebo výběru | Klon nepřežije a není to čas, který záznam tvrdí. |
| Pravidlo uchovávání, které jmenuje vzor souboru místo úložiště | Adresář o 10 GB je to, co to stojí. |
| Obchozí kanály vynucovaného pravidla | Dvě tam existovaly, v disciplíně, jejíž vlastní politika říkala, že ji nelze obejít. |
| Druhé „search“, jehož kontrakt tiše nahradí první | search zůstává doslovným skenem trvalých záznamů bez indexu. knowledge search je jiný korpus s jiným kontraktem a obojí to říká. |