73. Úkol jmenuje kritérium záměru, kterému slouží, a pokrytí každého kritéria se odvozuje z plánu
Kontext
ADR 0070 činí ze záměru typovaný záznam: výrok, invarianty, milníky, které ho realizují, a kritéria uspokojení, z nichž každé jmenuje důkazy, které ho rozhodují. Dává záměr do vztahu k milníkům a k důkazům. Nedává kritérium do vztahu k práci, která ho má učinit pravdivým. Záměr tak může jmenovat milník, jehož úkoly řeší dvě ze čtyř kritérií, a nic neříká, že zbylá dvě nemají žádnou práci, dokud si někdo při ověřování nevšimne, že je nelze splnit.
Otázky, které si plánovač a recenzent kladou před provedením, tedy z repozitáře stále nelze zodpovědět: který úkol nese toto kritérium, proč tento úkol existuje, které kritérium nemá žádnou práci, který milník nepřispívá k záměru, který ho jmenuje, a které dva úkoly dělají totéž.
Rozhodnutí
Úkol může deklarovat serves: seznam odkazů <intent-id>#<criterion-id>. Odkaz se píše na úkolu, protože úkol je prováděcí smlouva a píše se po záměru; záměr své úkoly nevypisuje, takže přeplánování záměr nikdy neupravuje.
Spojení se odvozuje, nikdy neukládá, pomocí intent_plan::coverage nad jedním IntentOutline na záměr (jeho id, id kritérií, milníky a zda je vyřazen) a odvozeným Plan. Engine záměrů převádí vlastní záznam na osnovu, takže soubory záměrů se čtou jedním způsobem.
Záměr, který nikdo ještě neplánoval, není tatáž vada jako plán, který míjí kritérium: první je místo, kde začíná každý záměr. Záměr, jehož milníky nenesou žádný živý úkol, se hlásí jednou jako intent_not_planned, varování, a jeho kritéria se neodmítají jednotlivě pro nedostatek práce. Jakmile pod některým z jeho milníků sedí jakýkoli živý úkol, kritérium, které plán míjí, je selhání.
Pokrytí odmítá, jako selhání:
criterion_uncovered— žádný živý úkol neslouží kritériu živého záměru, který má práci;issue_without_purpose— živý úkol pod milníkem, který záměr pojmenovává, nic neslouží;serves_outside_milestone— úkol slouží kritériu záměru, který nejmenuje milník toho úkolu;serves_unknown_intent,serves_unknown_criterion,malformed_serves— visící nebo poškozené odkazy.
Varuje na criterion_weakly_covered (každý sloužící úkol nevyžaduje žádné důkazy), milestone_contributes_nothing (pojmenovaný milník nenese žádné kritérium záměru), duplicate_work (dva živé úkoly slouží jednomu kritériu s překrývajícím se rozsahem) a duplicate_serves.
Úkol pod milníkem, který žádný intent nejmenuje, má původ maintenance. To je legitimní práce uvedená jako taková, nikdy nález a nikdy se jí nepřidělí vymyšlený intent. Zrušený nebo nahrazený intent nedluží žádné pokrytí.
Plánování vychází ze dvou typovaných záznamů, které worker zapíše a Majordomus ověří, nikdy z promptu. Majordomus o mezeře ani o plánu neuvažuje; to dělá člověk nebo model, a to, co zjistil, se stane něčím, co lze odmítnout:
- mezera (
.ai/repo/project/gaps/<intent>.yaml,majordomus.gap/v1) zaznamenává na commituobserved_atpozorování s jejich zdrojem a jednu podmínku na kritérium —satisfied,missing,conflictingnebounknown— s pozorováními, která za ní stojí, plus rizika a navrhovanou práci. Mezera, která nechá kritérium bez odpovědi, odpoví na kritérium, které intent nedeklaruje, nebo tvrdí stav bez pozorování, je odmítnuta;unknownje povoleno a nikdy se nečte jako splněno. Kritérium pozorované jakosatisfieds deklarovanými pozorováními nežádá žádnou plánovanou práci (síla pokrytíobserved); zda je splněno, zůstává otázkou důkazů (ADR 0070). - kritika (
.ai/repo/project/critiques/<intent>.yaml,majordomus.critique/v1) zaznamenává adversariální průchod plánem: nálezy zařazené podle položené otázky (missed_requirement,unproven_assumption,insufficient_work,unnecessary_work,regression_risk,surface_missing,delivery_verification), každýblockingnebo ne, a vyřešenýopen,planneddo stávajícího úkolu, který záměru slouží, neborejecteds důvodem. Úkol sloužící záměru, který je ACTIVE, VERIFY nebo DONE, zatímco záměr nemá kritiku (executing_without_critique) nebo má otevřený blokující nález (executing_with_open_blocker), se odmítne; plánovaná práce dosud bez kritiky je varování.
Plán nese serves jen jako data. Nepřidává žádné vlastní zjištění, takže dva enginy plánu (lib/project.awk a plan.rs, držené shodné případem 99) se v tom, co odvozují, nemění.
Zamítnuté alternativy
Záměr vypisuje úkoly podle kritéria. Každé přeplánování by upravovalo záměr a ten by se stal druhým indexem plánu.
Pokrytí uvnitř plan validate. Plán by musel číst záměry a awk engine by potřeboval druhou implementaci joinu, který na každém povrchu zvládne obsloužit jen Rust engine.
Nepokrytá kritéria jako varování. Kritérium, které nic nenaplní, je vada, již toto má zachytit před provedením; varování se čte až po dokončení práce. Jediné ponechané varování, intent_not_planned, se týká záměru bez jakéhokoli plánu, který by žádné selhání nemohlo popsat, aniž by odmítlo každý nově deklarovaný záměr.
Důsledky
- Až druh záměru přistane (ADR 0070),
intent validatehlásí tyto nálezy vedle svých vlastních a gateintent-checkodmítne nepokryté kritérium. - Záměr deklarovaný dřív, než jsou napsány jeho úkoly, se čte jako
intent_not_planned, dokud nejsou; deklarace záměru a úkolů, které mu slouží, v jedné změně to odstraní. - Nic negeneruje plán z mezery. Pracovník promění navrženou práci v úkoly, které
serveskritéria, a zaznamenáwork[].issue; validace odmítne odkaz, který neplatí. Automatické odvozování zůstává mimo rozsah, protože Majordomus o mezeře ani plánu neuvažuje (rozhodnutí výše); ADR 0070 to žádným směrem nerozhoduje. - Zastaralost mezery vůči pozdějším commitům se zde neposuzuje:
observed_atje zaznamenáno, aby je pozdější řez mohl porovnat s cestami, na které odkazují kritéria záměru.