work-graph-github — Projekce na GitHub je hlídaná, identifikovatelná a procházitelná a sloučený pull request vede zpět k výsledku, kterému sloužil
Projekce nemůže tiše zetlít: kontrola spouští kontrolu driftu při každé změně, která může pohnout modelem nebo adaptérem, a drift je selhání CI s pojmenovaným záznamem. Identita cestuje se záznamem, ne vyčtená z jeho titulku, takže přejmenování titulku na GitHubu nic nepřesune a nevytvoří duplikát, a remote může být fixture, takže se dá bez sítě dokázat, který záznam je který. Slovník sladění rozlišuje stavy, které dosud slučuje, takže `missing` už nestojí za záznam, který nebyl nikdy vytvořen, i za záznam, který člověk smazal, a vzdálená úprava se hlásí jako vzdálená úprava. Nad projekcí pull request pojmenovává úkol, který realizuje, a hrana se odvozuje z gitu a GitHubu, ne z paměti, takže mergnutý commit vede zpět ke kritériím přijetí, která splnil, a výsledek vede vpřed k důkazům, že platí. Odvození, která shell už počítá — ready, blocked, waves, next, status — jsou čitelná přes stejný povrch schopností jako vše ostatní, co tento repozitář ví, ne jen z terminálu.
HOTOVO 10 z 10 úkolů hotovo
- připraveno
- 0
- blokováno
- 0
- aktivní
- 0
- verify
- 0
- hotovo
- 10
- zrušeno
- 0
Problém
Tento repozitář už práci modeluje jednou: milníky jsou výsledky, úkoly jsou prováděcí smlouvy, žádný stav se neukládá a `scripts/github-sync` promítá obojí na GitHub s oblastí označenou hashem, která chrání to, co napsal člověk. Model není vada. Vadou je, že detektor nikdo nespouští: `core-check` spouští `github-sync --plan` a `--render`, nikdy `--check`, takže exit 11 adaptéru se v CI nikdy nespustil. Projekce byla aplikována jednou 2026-09-04 a od té doby ne. Změřeno 2026-09-09 na 867f3a9: 191 zjištění driftu, z toho 172 jsou kanonické úkoly, které na GitHubu nikdy neexistovaly, a 19 jsou těla, jejichž kanonický text se posunul. Všech 8 milníků je synchronizovaných, což je přesně to, co činí hnilobu neviditelnou: povrch, na který se člověk dívá, je povrch, který se stále shoduje. Pod tím adaptér identifikuje vzdálený záznam rozborem jeho názvu na předponu `I0001 — ` a čte vzdálenou stranu přes stránku o 200 položkách, která už drží 19 úkolů a 117 pull requestů, takže mapování se rozbije, když člověk přejmenuje název, a čtení se zkrátí, jakmile běží backfill.
Výsledek
Projekce nemůže tiše zetlít: kontrola spouští kontrolu driftu při každé změně, která může pohnout modelem nebo adaptérem, a drift je selhání CI s pojmenovaným záznamem. Identita cestuje se záznamem, ne vyčtená z jeho titulku, takže přejmenování titulku na GitHubu nic nepřesune a nevytvoří duplikát, a remote může být fixture, takže se dá bez sítě dokázat, který záznam je který. Slovník sladění rozlišuje stavy, které dosud slučuje, takže `missing` už nestojí za záznam, který nebyl nikdy vytvořen, i za záznam, který člověk smazal, a vzdálená úprava se hlásí jako vzdálená úprava. Nad projekcí pull request pojmenovává úkol, který realizuje, a hrana se odvozuje z gitu a GitHubu, ne z paměti, takže mergnutý commit vede zpět ke kritériím přijetí, která splnil, a výsledek vede vpřed k důkazům, že platí. Odvození, která shell už počítá — ready, blocked, waves, next, status — jsou čitelná přes stejný povrch schopností jako vše ostatní, co tento repozitář ví, ne jen z terminálu.
Aktuální stav
Kanonický model tvoří 15 milníků a 184 úkolů, validovaných příkazem `majordomus plan validate` (0 selhání, 4 varování o rozsahu) a vynucovaných `lib/doctor.sh` a `scripts/ci/core-check`. `scripts/github-sync` implementuje plan, check, apply a render s vlastnictvím polí a hashem značky. GitHub drží 8 milníků a 19 úkolů. `--check` končí s 11 při driftu a žádná kontrola jej nevolá. Úkoly a milníky se servírují jako dokumenty přes `objects.get` a žádné z odvození plánu není schopností: `lib/plan.sh` je počítá a spustitelný soubor v Rustu čte `.ai/repo/project/issues/` jen kvůli názvům souborů. Důkazy nesou volitelný řetězec `commit` a žádný pull request, běh kontroly ani větev.
Cílový stav
Přispěvatel přesune úkol, spustí kontroly a CI mu řekne, že projekce zaostává, dřív než recenzent. Člověk přejmenuje úkol na GitHubu a další synchronizace jej aktualizuje místo duplikace. Čtenář se zeptá, který pull request úkol realizoval, nebo kterému výsledku sloužil zmergovaný commit, a jeden příkaz odpoví z odvozených hran. Připravenost plánu lze zjistit přes MCP a HTTP, protože je to schopnost, ne shellová funkce.
Rozsah
- scripts/github-sync
- scripts/ci
- .ai/repo/ci/gates.yaml
- .ai/repo/project
- .ai/repo/rules/project
- .ai/repo/adrs
- apps/majordomus-cli/src
- lib/plan.sh
- lib/project.sh
- dokumentace
- web
- test/cases
Mimo rozsah
- Nahrazení kanonického modelu, které není tou vadou
- Import sémantiky GitHubu do kanonických záznamů; GitHub zůstává projekcí
- Přesun síťových volání do samotného nástroje, což test/cases/08_no_forbidden_constructs.sh zakazuje
- Klient GraphQL nebo jakákoli abstrakce providera nad rámec jednoho hostitele GitHub, na který tento repozitář publikuje
- Přiřazení, reakce, nástěnky projektů nebo diskuse
Kritéria přijetí
- Kontrola spouští kontrolu driftu při každé změně, která může pohnout modelem nebo adaptérem, a nález driftu shodí CI s uvedením záznamu a nápravy
- Identita jsou kanonická data: přejmenování titulu na GitHubu přesune mapování s ním a nevytvoří duplicitní záznam
- Smiřování je dokazatelné offline proti fixture remote a fixture je odmítnut při jakékoli mutaci
- Slovník smiřování rozlišuje never-created, deleted-remotely, edited-remotely, canonically-moved a conflicting a každý stav jmenuje, co by se změnilo, dříve než se cokoli změní
- Pull request je s úkolem, který realizuje, spojen odvozenou hranou a vztah lze procházet oběma směry
- Odvození plánu jsou čitelná přes povrch schopností a přidání dalšího nevyžaduje úpravu registru transportů
- Každé tvrzení, které tento milník činí o GitHubu, je podloženo testem, který běží offline proti fixture
Validace
- scripts/github-sync --check
- scripts/ci/core-check
- bash test/run.sh
- cargo test --workspace --all-features
- majordomus generate --check
Požadované důkazy
- drift_gated
- identity_stable
- offline_provable
- traceability_both_ways
Rizika
- Zpětné doplnění je mutace směřující ven: aplikace projekce vytvoří zhruba 180 veřejných úkolů v jednom běhu. Musí to být záměrný, potvrzený čin, ne vedlejší efekt zapojení gate.
- Zapojení kontroly před doplněním způsobí, že CI na masteru zčervená, dokud doplnění nepřistane. Na pořadí záleží a je součástí práce.
Důkazy
Milník není nikdy hotový tím, že jsou hotové jeho úkoly; poslední krok je jeho vlastní přijetí a podmiňují jej řádky níže.
| pokrývá | typ | command | výsledek |
|---|---|---|---|
| drift_gated | test | bash test/run.sh 97_github_gate | tests: 1 passed, 0 failed, 0 skipped on master 01227a0f74a (2026-10-17); gate github-projection runs scripts/ci/github-check, and the github-projection workflow run 39004503235 was green on 01227a0f74a |
| identity_stable | test | bash test/run.sh 45_github_projection 602_a_spliced_body_is_recognised_as_its_own | testy: 2 prošly, 0 selhaly, 0 přeskočeny na master 01227a0f74a (2026-10-17): přepsaný vzdálený titul se vyhodnotí podle své značky, spojené tělo se čte zpět jako insync |
| offline_provable | test | bash test/run.sh 45_github_projection | testy: 1 prošel, 0 selhalo, 0 přeskočeno na master 01227a0f74a (2026-10-17): sesouhlasení běží proti fixture remotes bez sítě a bez tokenu; --apply fixture odmítne |
| traceability_both_ways | test | bash test/run.sh 98_traceability 99_work_graph_chain 99_plan_capabilities | testy: 3 prošly, 0 selhaly, 0 přeskočeny na master 01227a0f74a plus uzavřené záznamy (2026-10-17): úkol vede ke své branchi, merge a commitům a commit vede zpět ke svému úkolu a milníku |
Úkoly
Každý z nich je prováděcí kontrakt s vlastními kritérii přijetí, validačním příkazem a požadovanými důkazy. Sloupec wave je vrstva grafu závislostí, v níž úkol leží.
| issue | status | vlna | závisí na | název |
|---|---|---|---|---|
| I1401 | HOTOVO | 0 | — | Identita promítnutého záznamu je to, co záznam nese, ne to, co říká jeho titulek |
| I1402 | HOTOVO | 1 | I1401 | Nález říká, který ze šesti stavů nalezl, a stav, který mohl skrýt cizí úpravu, už mezi nimi není |
| I1403 | HOTOVO | 3 | I1401, I1402, I1404 | Projekci jednou doplnit zpětně, záměrně, a zaznamenat, co vytvořila |
| I1404 | HOTOVO | 2 | I1402 | Kontrola driftu je brána, takže projekce, která se přestane aplikovat, nemůže mlčet |
| I1405 | HOTOVO | 1 | I1401 | Pull request jmenuje úkol, který realizuje, a hrana se odvozuje, nepamatuje si |
| I1406 | HOTOVO | 0 | — | Derivace plánu jsou schopnosti, takže každý povrch čte připravenost, kterou čte terminál |
| I1407 | HOTOVO | 3 | I1404, I1405, I1406 | Jeden úkol projde celou cestu tam a zpět jako spustitelný případ |
| I1408 | HOTOVO | 3 | I1404 | Dokumenty přestanou tvrdit projekci, kterou nikdo nespouští |
| I1516 | HOTOVO | 0 | — | Adaptér skládá promítnuté tělo na jednom místě |
| I2300 | HOTOVO | 0 | — | Head se posuzuje podle toho, co mění, ne podle živého stavu GitHubu |
Graf
flowchart LR
I1401["I1401<br/>The identity of a projected record is what the record carries, not what its title says"]:::done
I1402["I1402<br/>A finding says which of six states it found, and the state that could hide a person's edit is no longer one of them"]:::done
I1403["I1403<br/>Backfill the projection once, deliberately, and record what it created"]:::done
I1404["I1404<br/>The drift check is a gate, so a projection that stops being applied cannot stay silent"]:::done
I1405["I1405<br/>A pull request names the issue it realises, and the edge is derived rather than remembered"]:::done
I1406["I1406<br/>The plan's derivations are capabilities, so every surface reads the readiness the terminal reads"]:::done
I1407["I1407<br/>One issue travels the whole path and back, as an executable case"]:::done
I1408["I1408<br/>The documents stop claiming a projection nobody runs"]:::done
I1516["I1516<br/>The adapter composes a projected body in one place"]:::done
I2300["I2300<br/>A head is judged against what it changes, not against GitHub's live state"]:::done
I1401 --> I1402
I1401 --> I1403
I1401 --> I1405
I1402 --> I1403
I1402 --> I1404
I1404 --> I1403
I1404 --> I1407
I1404 --> I1408
I1405 --> I1407
I1406 --> I1407
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxOdkazováno z tohoto diagramu (10)
- I1401 Identita promítnutého záznamu je to, co záznam nese, ne to, co říká jeho název
- I1402 Nález říká, který ze šesti stavů našel, a stav, který by mohl skrýt úpravu člověka, mezi nimi už není
- I1403 Jednou, záměrně, doplnit projekci zpětně a zaznamenat, co vytvořila
- I1404 Kontrola driftu je brána, takže projekce, která se přestane aplikovat, nemůže mlčet
- I1405 Pull request jmenuje úkol, který realizuje, a hrana se odvozuje, nepamatuje
- I1406 Odvození plánu jsou schopnosti, takže každý povrch čte připravenost, kterou čte terminál
- I1407 Jeden úkol projde celou cestu tam i zpět, jako spustitelný případ
- I1408 Dokumenty přestávají tvrdit projekci, kterou nikdo nespouští
- I1516 Adaptér skládá promítnuté tělo na jednom místě
- I2300 Head se posuzuje podle toho, co mění, ne podle živého stavu GitHubu
Kanonický záznam: .ai/repo/project/milestones/work-graph-github.yaml. Přečtěte ho zpět pomocí majordomus plan show work-graph-github.