derived-data-integrity — Commitnuté odvození popisuje něco, čeho může být projekcí
Commitnutý odvozený artefakt je projekcí vstupů, které commit vlastní. Přistání nesouvisející změny na trunku ho neneplatní, fixture, jejíž databáze objektů nemá historii, ho stále dokáže vyhodnotit, a odmítnutí kvůli zastarání existuje na cestě, kterou merge skutečně jdou — takže první, co řekne ne, je kontrola, nikoli publikovaný web.
AKTIVNÍ 1 of 3 issues done
- připraveno
- 2
- blokováno
- 0
- aktivní
- 0
- verify
- 0
- hotovo
- 1
- zrušeno
- 0
Problém
Odvozený artefakt se commituje s otiskem toho, co jej vytvořilo, a kontroly porovnávají tento otisk se stromem. Dvě věci způsobují, že záznam nemůže zůstat pravdivý. Hashuje celou vstupní množinu, takže nesouvisející změna přistávající na kmeni zneplatní odvození, které není špatné — strom se prostě pohnul; a kde hashuje HEAD, soubor uvnitř commitu nemůže popsat commit, ve kterém je, což apps/majordomus-cli/src/release/changelog.rs:75 říká ve vlastním komentáři, zatímco kontrola sahá přes něj. Náklady se platí denně a odděleně: každá větev se po každém merge odvozuje znovu, pokaždé šest až pětatřicet minut; testovací vstup bez historie nemůže artefakt vůbec vyhodnotit; a odmítnutí, které zastaralý záznam zachytí, žije v pre-commit hooku, který se nemůže spustit pro merge vytvořený serverem. Takže první věc v pipeline, která může říct ne, je publikace.
Výsledek
Commitnutý odvozený artefakt je projekcí vstupů, které commit vlastní. Přistání nesouvisející změny na trunku ho neneplatní, fixture, jejíž databáze objektů nemá historii, ho stále dokáže vyhodnotit, a odmítnutí kvůli zastarání existuje na cestě, kterou merge skutečně jdou — takže první, co řekne ne, je kontrola, nikoli publikovaný web.
Aktuální stav
Změřeno 2026-09-10. master 3fb515f5c zaznamenává source_hash e6abaa4665163bcd, zatímco hash jeho stromu je 4fe657a09b10, a tři po sobě jdoucí běhy Pages na masteru selhaly shodně v kroku buildu kvůli tomuto odmítnutí; web naposledy odpovídal z 5e67318db. Dva z těch tří mergů commitnul GitHub, kde žádný pre-commit hook neexistuje, a gh api branches/master/protection vrací 404 Branch not protected, takže gate webu, který aktuálnost kontroluje, je poradní a hlásí až po mergi. c44c2d4c8 a 2ce8d66e5 zaznamenávají stejný source_hash - merge driver řeší odvozené artefakty na naši stranu, takže zastaralý záznam projde mergem nedotčen. test/cases/56_derived_current_gate.sh exportuje git archive HEAD do fixture bez commitů, takže složení changelogu hlásí fatal: Not a valid commit name. Jedna větev zaplatila za jeden večer 185 s, 1125 s a 2135 s znovuodvozování, celé proto, že se pod ní posunul trunk.
Cílový stav
Záznam pokrývá to, co commit vlastní. Kontrola, která odmítne zastaralý, běží tam, kde se dějí merge. Changelog se skládá z něčeho, co fixture umí vyhodnotit. Nikdo neodvozuje znovu, aby zodpověděl otázku, na kterou odvození už mělo pravdu.
Rozsah
- skripty
- apps/majordomus-cli/src/release
- .ai/repo/ci
- test/cases
- docs/CI.md
Mimo rozsah
- Přimět build Pages, aby znovu odvozoval, místo aby odmítal. Otisk vstupu je deterministický - tři běhy na jednom stromu jsou bajt po bajtu shodné - ale vygenerovaný obsah závisí na stroji: %h zkracuje proti lokálnímu úložišti objektů, checkout s hloubkou 1 zapisuje degradovaný changelog, souběžný derive může číst kořen sourozeneckého worktree. Build, který by znovu odvozoval, by mohl vyrobit třetí odpověď, která neodpovídá žádné straně. Zaznamenáno zde, protože tento východ bude navržen znovu a protože námitka formulovaná jako nedeterminismus otisku je vyvratitelná jedním příkazem a strhla by s sebou správnou námitku.
- Zapnutí ochrany větve nebo volba, která kontrola je povinná. Nastavení repozitáře a rozhodnutí provozovatele.
- Oslabení odvozeného merge driveru. Vyřešit ve prospěch našeho je správné; chybí odmítnutí za ním na straně serveru.
Kritéria přijetí
- Odvozený artefakt commitnutý na jednom commitu je na tomto commitu stále aktuální poté, co na kmen přistane nesouvisející změna
- Fixture, jejíž databáze objektů neobsahuje testovaný commit, dokáže vyhodnotit každý odvozený artefakt
- Odmítnutí zastaralosti běží na cestě, kterou jde merge na straně serveru, nebo záznam jmenuje rozhodnutí, které se místo toho přijalo
- Žádný dokument netvrdí ochranu, kterou merge vytvořený GitHubem nedosáhne
Validace
- scripts/derive-check
- scripts/pages current
- test/run.sh 56_derived_current_gate
Požadované důkazy
- derivation_survives_an_unrelated_merge
- fixture_without_history_evaluates
Rizika
- Zúžení toho, co záznam pokrývá, je tiché v nebezpečném směru: příliš úzké a zastaralost přestane být zjistitelná, což se čte jako zelená, ne jako šum. Každá změna zde potřebuje případ, který dokazuje, že kontrola stále něco odmítá.
- Subsystém se dotýká každá větev, takže změna přistává v trvalém sporu se vším ostatním, co právě derivuje.
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 |
|---|---|---|---|
| derivation_survives_an_unrelated_merge | test | bash test/run.sh 3048_a_derivation_survives_an_unrelated_merge | testy: 1 prošel, 0 selhalo, 0 přeskočeno na masteru 01227a0f74a (2026-10-17, MAJORDOMUS_BIN = build onoho stromu); I1409 HOTOVO |
| fixture_without_history_evaluates | test | bash test/run.sh 3055_a_derivation_needs_no_history | testy: 1 prošel, 0 selhalo, 0 přeskočeno na masteru 01227a0f74a (2026-10-17, MAJORDOMUS_BIN = sestavení onoho stromu) |
Ú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 |
|---|---|---|---|---|
| I1409 | HOTOVO | 0 | — | Odvozená data přestanou hashovat vstupy, které nemohou řídit |
| I2863 | PŘIPRAVENO | 0 | — | A derive does not run while a merge is uncommitted |
| I2864 | PŘIPRAVENO | 0 | — | The site generator reads no output of a later derive stage |
Graf
flowchart LR
I1409["I1409<br/>Derived data stops hashing inputs it cannot control"]:::done
I2863["I2863<br/>A derive does not run while a merge is uncommitted"]:::ready
I2864["I2864<br/>The site generator reads no output of a later derive stage"]:::ready
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:2pxKanonický záznam: .ai/repo/project/milestones/derived-data-integrity.yaml. Přečtěte ho zpět pomocí majordomus plan show derived-data-integrity.