Zdůvodnění
Dockerfile a jeho ignorovací soubor psané ručně opakují, co repozitář už ví — port, na který se server naváže, trasy, které registruje, binárku, kterou workspace jmenuje, cesty, které build čte — a každý z těchto párů se rozejde, jakmile se změní jedna půlka. Selhání je tiché a objeví se v produkci: image, který spouští binárku pod jménem, které už nikdo nesestavuje, health check namířený na přejmenovanou trasu, stroj dimenzovaný na hodnotu paměti, kterou release přerostl.
Repozitář už takový tvar odmítá všude jinde. Schopnost se deklaruje jednou a promítá do CLI, HTTP, MCP, OpenAPI, dokumentace a webu a generate --check selže, když projekce zastará. Nasazení je fakt stejného druhu a přichází stejně, nebo nepřichází vůbec.
Druhý důvod jsou peníze a zveřejnění. Nasazení uvádí, kolik toho běží a jak dlouho, takže popis musí být tam, kde ho recenzent čte, ne v dashboardu providera, který nikdo nediffuje. A nikdy nesmí obsahovat pověření, které ho autorizuje: smlouva pro něj nemá žádné pole a token propašovaný do pole, které existuje, je zde odmítnut.
Požadované chování
Deployment je objekt *.yaml v sekci deployments vrstvy, platný vůči share/schemas/majordomus/deployment/deployment.v1.schema.json (deployment/v1). Uvádí aplikaci, dodaný balíček a binárku, port a rozhraní, na kterém proces naslouchá, trasy liveness a readiness, zdroje, počet strojů, region a vstupy buildu — každé právě jednou. Nejmenuje žádného hostingového poskytovatele: žádný není cílem a klíč provider se odmítne jako každý jiný klíč, který kontrakt nemá.
Klíče uzavírá share/allow/deployment.txt, generované ze schématu: neznámý klíč je chyba, nikdy se nepřenáší. Dva objekty si nesmějí nárokovat jednu identitu. min_running nesmí přesáhnout count. Trasa health je cesta, ne URL. Port je neprivilegovaný, protože nasazený proces neběží jako root.
Každý artefakt z něj sestavený — definice image kontejneru a její ignore soubor — zapisuje majordomus generate z tohoto objektu, nese hlavičku proveniencí jmenující svůj zdroj a příkaz regenerace a porovnává ho generate --check. Přispěvateli, který upraví generovaný artefakt, se místo toho řekne, který soubor změnit.
Chování při selhání
Porušení je nález FAIL v kategorii deployment, jmenující objekt, klíč, nalezenou hodnotu a nápravu; příkaz, který ho našel, skončí s kódem 10 a pod watch je to drift a příkaz skončí s kódem 11.
Ověření
Rozhoduje o tom mj_validate_deployments, spouštěné z doctor, watch. Behaviorální případ test/cases/84_deployment_contract.sh to dokazuje mutací: neznámý klíč, blok provider, neznámá verze schématu, chybějící povinné pole, privilegovaný port, min_running nad count, health routa, která není cestou, duplicitní identita a přihlašovací údaj v existujícím poli — každé odmítnuto jménem; a platný objekt, který se dostane do indexu a výpisu objektů, aniž by se cokoli kdekoli registrovalo.