Plán a jeho odvozeniny
Model milníků a úkolů tohoto repozitáře a vše, co se z něj odvozuje a co nikdo nenapsal: stav každého záznamu, grafy závislostí nad hranicí milníku i pod ní, topologické vlny provádění, pořadí podle plánu rozvoje, právě prováděný milník a jeden úkol, který vzít jako další. Stav se nikdy neukládá — záznam říká, co se s ním stalo, a stav z toho a ze stavu jeho závislostí vyplývá — takže žádný soubor nemůže odporovat grafu. Tato schopnost čte; zápis značky životního cyklu do záznamu je `plan.transition`, která deklaruje, že zapisuje do repozitáře.
Model milníků a úkolů tohoto repozitáře a vše, co se z něj odvozuje a co nikdo nenapsal: stav každého záznamu, grafy závislostí nad hranicí milníku i pod ní, topologické vlny provádění, pořadí podle plánu rozvoje, právě prováděný milník a jeden úkol, který vzít jako další. Stav se nikdy neukládá — záznam říká, co se s ním stalo, a stav z toho a ze stavu jeho závislostí vyplývá — takže žádný soubor nemůže odporovat grafu. Tato schopnost čte; zápis značky životního cyklu do záznamu je `plan.transition`, která deklaruje, že zapisuje do repozitáře.
- modul plan
- builtin
- behaviorally_verified
- 12 schopností
Schopnosti
Každý je složen v souboru tohoto modulu; každý má vlastní stránku.
plan.deliveryPro každý úkol (nebo jeden) nejdále prokázaná fáze dodání — none, branch, pr_open, merged, released, deployed — každá s objektem, který ji prokázal, a kdy byl pozorován: větev, která úkol jmenuje (id, pravidlem I1405, nebo slugem), otevřený pull request v zaznamenaném pozorování forge, nejnovější commit v historii trunku, který jej jmenuje (merge podle názvu pull requestu či větve, jakýkoli jiný commit podle předmětu, nikdy podle těla), první záznam release (`.ai/repo/releases/v*.yaml`), jehož commit ten merge obsahuje, a publikovaný `latest.json`, který jmenuje ten release nebo pozdější. Vedle toho deklarovaný stav úkolu, takže rozpor mezi razítky a prací je na jedno porovnání. Ve výchozím stavu živě: trunk, který tento klon zná, každá větev, pozorování forge zaznamenané `majordomus prs refresh`, záznamy release a `latest.json` commitu, který publikoval poslední deployment Pages. S `at` merge z historie toho commitu a záznamy release stromu a nic živého — každý zdroj větví, forge a deploymentu je hlášen jako nepřečtený — takže lze prokázat jen merged a released a odpověď je funkcí samotného commitu. Zdroj, který nebyl přečten, se hlásí jako nepřečtený s důvodem, nikdy jako none: úkol, který mohl postoupit dál, není uzavřen a zdroj jmenuje. Odvozuje se při každém volání a nikde se neukládá; nikdy nezapisuje razítko.query · experimental · majordomus_plan_delivery · GET /api/v1/plan/deliveryplan.driftKaždý rozpor mezi deklarovaným statusem úkolu a jeho dodáním (plan.delivery), každý s objekty, které jej dokazují: `merged_not_recorded` — READY, BLOCKED nebo ACTIVE, s mergem na trunku, který jej jmenuje (pull request, merge commit, release), a bez otevřeného pull requestu, který jej jmenuje; `active_without_work` — ACTIVE od doby před oknem, bez větve, pull requestu, mergu nebo živého nároku v meshi, který by jej jmenoval; `done_without_trace` — DONE bez mergu, který by jej jmenoval, poradní, protože existují úkoly jen se záznamem. Každé zjištění nese své stáří, zda je za oknem, které deklaruje `.ai/repo/ci/plan.yaml` (`drift.window`, sekundy), zdroje, které nebyly přečteny a mohly by je rozpustit, a příkaz, který jej vyřeší (`majordomus plan verify|done <id>`). S `gate` se posuzuje jako kontrola: na `head` je každé merged_not_recorded pending; na `trunk` je to, co bylo sloučeno před delší dobou než okno, odmítnuto a mladší je pending; ostatní třídy nikdy neodmítají; chybějící nebo nečitelné okno odmítá (exit 12); odmítnutí shazují kontrolu (exit 10) jen pod `drift.enforcement: blocking` a pod `advisory` se hlásí s exit 0. Pozorováno živě, nebo `at` commitu jako plan.delivery. Odvozováno při každém volání; nikdy nezapisuje razítko.query · experimental · majordomus_plan_drift · GET /api/v1/plan/driftplan.flightMilníky s rozpracovanou prací, ten, který graf dovolí příště, a poslední release tak, jak ho říkají samotné releasy, čteno živě při každém volání (ADR 0166, rozhodnutí 4). Nyní je každý otevřený milník, který drží otevřený úkol s otevřeným pull requestem, který jej jmenuje (`pr_open` z `plan.delivery`), živý claim v meshi pro něj učiněný, nebo deklarovaný stav ACTIVE, každý s těmito úkoly, proč jsou rozpracované, jejich deklarovaným stavem vedle odvozeného stupně a objekty, které to dokazují (větev, pull request, merge commit, tag releasu, publikovaný `latest.json`, claim), odkazovanými na forgi, kde je forge má. Příště je první otevřený milník v pořadí plánu, který není nyní a jehož nedokončené předpoklady jsou všechny nyní. Poslední release je nejvyšší stabilní verze mezi záznamy releasů, tagy `v*` tohoto klonu a `latest.json`, který publikovalo poslední úspěšné nasazení Pages, takže release, jehož záznam byl sloučen po jeho tagu, se neukáže starší, než je; `executable_tagged` říká, zda je verze odpovídajícího spustitelného souboru otagována. `milestone` přidá ten milník se všemi jeho úkoly. Zdroj, který nebyl přečten (forge, publikace, mesh mimo server), je jmenován s důvodem, nikdy ne považován za prázdný.query · experimental · majordomus_plan_flight · GET /api/v1/plan/flightplan.issuesJeden záznam na úkol s jeho odvozeným stavem, vlnou, deklarovanými závislostmi, těmi, které nejsou DONE (plus `milestone:<id>`, když kontrola drží zpět celý výsledek), úkoly, které na něm závisejí, cestami, kterých se dotýká, a souhrnem jeho důkazů. Filtrování podle `status: READY` je množina připravených a podle `status: BLOCKED` množina blokovaných; nic zde není samostatné odvození.query · behaviorally_verified · majordomus_plan_issues · GET /api/v1/plan/issuesplan.modelKaždý milník a úkol s odvozeným stavem, vlnou, pořadím, oběma směry jeho grafu a počty; vlny provádění; oba grafy závislostí jako hrany; každé zjištění validace; a hlavička plánu s odvozeným aktivním milníkem. Jediná hodnota, z níž odpovídá každá další schopnost tohoto modulu. Odvozuje se při každém volání: přechod zapíše značku životního cyklu do záznamu mezi dvěma voláními a plán odpovězený ze snímku by poslal dva pracovníky k jednomu úkolu.query · behaviorally_verified · majordomus_plan · GET /api/v1/planplan.nextPŘIPRAVENÝ úkol aktivního milníku v nejnižší vlně, nejdřív s nejvyšší prioritou, pak podle id. Aktivní milník nemusí mít nic připraveného, zatímco jiný ano — například jeden čekající na vlastní důkazy přijetí — takže se hledání rozšíří na celý plán, místo aby odpovědělo `none` a odeslalo workera pryč od práce, která je skutečně proveditelná. To je to, na co se agent ptá, než začne.dotaz · behaviorally_verified · majordomus_plan_next · GET /api/v1/plan/nextplan.recordMilník se všemi svými úkoly, nebo úkol se všemi úkoly, na které čeká. Vlastní próza záznamu zůstává tam, kde byla vždy — `majordomus://issue/<id>` vrací soubor — a toto odpovídá na to, co soubor o sobě říct nedokáže: jaký má stav, kde v grafu sedí a co stojí mezi ním a tím, aby byl proveditelný.query · behaviorally_verified · majordomus_plan_record · GET /api/v1/plan/recordplan.roadmapGraf milníků rozložený podle pořadí, kde `order` rozhoduje remízy jen uvnitř pořadí, s prvním neblokovaným nedokončeným milníkem jako `now` a následujícím jako `next`. Nic v posloupnosti není psáno ručně: milník, jehož předpoklady nejsou skutečné, nelze nominovat, a právě to dělá z `each step is gated by the previous one being real` invariant, nikoli větu.query · behaviorally_verified · majordomus_plan_roadmap · GET /api/v1/plan/roadmapplan.statusKaždý milník s odvozeným stavem a svými úkoly spočtenými podle stavu, milník, který worker právě provádí, další připravený úkol celý a vlastní součty plánu. Počty jsou klíčovány deklarovaným slovníkem, který putuje s odpovědí, takže stav přidaný do enginu se zde objeví, aniž by se cokoli upravovalo.query · behaviorally_verified · majordomus_plan_status · GET /api/v1/plan/statusplan.transitionZaznamená, že provádění úkolu začalo (`start`), že implementace je hotová a čekají se důkazy (`verify`), nebo že je dokončeno (`done`). Označí se jedno pole vlastního záznamu úkolu, vedle něj se zapíše pečeť jeho události a událost se připíše do knihy; razítko bez této pečeti nepřesune žádný stav. Přesun se odmítne, když model říká, že je nepřípustný — úkol, který není READY, nelze začít, ten, který nikdy nebyl ACTIVE, nelze ověřit, a ten, který nebyl nikdy zahájen, jehož závislosti nejsou dokončeny nebo kterému chybí požadované důkazy, nelze dokončit — a odmítnutí jmenuje, co brání. Vrácený stav se potom odvodí ze záznamu, ne oznámí přesunem: `done` s chybějícími důkazy nechá úkol ve VERIFY a řekne to.command · behaviorally_verified · majordomus_plan_transition · POST /api/v1/plan/transitionplan.validateKaždý nález, který odvození vytvořilo, v pořadí, v jakém je vytvořilo: závislost na něčem, co není úkol, cyklus, úkol provedený před svými závislostmi nebo před kontrolou svého milníku, úkol bez akceptačních kritérií, chybějící důkazy při uvedeném datu dokončení, razítko životního cyklu, které jeho přechod nezapsal (bez pečeti jeho události plan_*), milník, jehož graf si protiřečí, dva úkoly jedné vlny sdílející cestu. Selhání znamená, že model je neplatný; varování znamená, že je legální a stojí za přečtení.query · behaviorally_verified · majordomus_plan_validate · GET /api/v1/plan/validateplan.wavesTopologické vrstvení grafu úkolů: úkol vstoupí do vlny, až když ji opustí všechny jeho závislosti, takže jeho vlna je o jednu vyšší než nejdelší cesta k němu. Sdílení vlny je nutná podmínka pro souběžné spuštění dvou úkolů, nikoli postačující — překrývající se rozsah je serializuje a každé takové překrytí je hlášeno vedle vln, místo aby ho dva workery objevily až v merge konfliktu.query · behaviorally_verified · majordomus_plan_waves · GET /api/v1/plan/waves