I1402 — Nález říká, který z šesti stavů našel, a stav, který mohl skrýt úpravu člověka, už mezi nimi není
Odvodit typovaný stav každého promítnutého záznamu ze dvou nezávislých otázek — přepsal člověk generovanou oblast od jejího zveřejnění a posunul se od té doby kanonický záznam? — a vykázat odpověď místo sloučení obou do jednoho slova.
HOTOVO vlna 1 · p1 · profil implementation · běží samostatně
Cíl
Odvodit typovaný stav každého promítnutého záznamu ze dvou nezávislých otázek — přepsal člověk generovanou oblast od jejího zveřejnění a posunul se od té doby kanonický záznam? — a vykázat odpověď místo sloučení obou do jednoho slova.
Proč
Kontrola hlásila `missing` a `body` a nic jiného a to druhé slovo skrývalo vadu. Adaptér deklaruje, že nepřepíše to, co člověk napsal uvnitř generované oblasti, a rozhodoval o tom porovnáním hashe značky na remote s kanonickým hashem: pokud se lišily, vrátil se předčasně. Ochrana tedy byla slepá přesně v případě, pro který je. Člověk upraví oblast, plán se pak posune a další --apply přeroste jeho slova kanonickým textem bez --force a bez jediného varování. Značka zaznamenává, jako co bylo tělo odesláno, takže na otázku se dalo vždy odpovědět proti značce, a ne proti kanonickému záznamu.
Aktuální stav
region_edited() vracelo false vždy, když se kanonický záznam posunul, takže `edited` bylo v běžném případě nedosažitelné. Nálezy o vzdáleném záznamu, který tvrdí neznámé kanonické id, se tiskly z uvnitř pipeline, tedy ze subshellu, takže počet driftu je nikdy neviděl a --check na nich nemohl selhat.
Cílový stav
insync, behind, edited, conflict, adopt a missing pro kanonický záznam a unmanaged pro vzdálený. --apply přepíše behind a adopt a odmítne edited a conflict bez --force. Každý nález se počítá do návratového kódu.
Rozsah
- scripts/github-sync
- test/cases/45_github_projection.sh
Mimo rozsah
- Rozlišit záznam, který nikdy nevznikl, od záznamu smazaného na GitHubu, což nelze odvodit z žádné strany bez druhého úložiště toho, co bylo vytvořeno; `missing` uvádí to, co je pozorovatelné, tedy že nyní neexistuje protějšek
- Automatické řešení konfliktu
Závislosti
Co na tom čeká
- I1403HOTOVO Doplnit projekci zpětně jednou, záměrně, a zaznamenat, co vytvořila
- I1404HOTOVO Kontrola driftu je kontrola, takže projekce, která přestane být aplikována, nemůže mlčet
Kritéria přijetí
- Úprava provedená člověkem je zjištěna bez ohledu na to, zda se kanonický záznam od té doby pohnul, což dokládá případ pro každou variantu
- Záznam, jehož region byl upraven a jehož kanonický záznam se také posunul, se hlásí jako konflikt a --apply ho bez --force odmítne
- Úkol, který si nárokuje kanonické id, jež tento repozitář nemá, se ohlásí a započítá, takže --check na něm selže
- Každý stav je prokázán případem, který sestaví remote jako fixture, offline
Validace
- bash test/run.sh 45_github_projection
- scripts/github-sync --check
Požadované důkazy
- states_distinguished
- edit_protection_holds
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| states_distinguished | test | bash test/run.sh 45_github_projection | šest stavů dokázaných proti fixture remote: insync, behind, edited, conflict, adopt, missing, plus unmanaged pro vzdálený záznam tvrdící neznámé id; nález unmanaged se nyní započítává do exit kódu | 3db47f7 |
| edit_protection_holds | test | bash test/run.sh 45_github_projection | upravená oblast se detekuje jak tehdy, je-li kanonický záznam nezměněn (edited), tak tehdy, posunul-li se od té doby (conflict); druhý případ byl dříve nedosažitelný, takže by --apply přepsal text člověka bez --force | 3db47f7 |
Riziko
Nízké. Každé rozlišení je odvozeno z bajtů, které obě strany už nesou.
Časová osa
- zahájeno
- 2026-09-09T17:20:34Z
- ověřeno
- 2026-09-09T17:20:41Z
- dokončeno
- 2026-09-09T17:20:44Z
Tato tři pole, důkazy výše a stav závislostí jsou vše, z čeho se stav skládá. Neexistuje žádné pole stavu, které by s nimi mohlo být v rozporu.
Kanonický záznam: .ai/repo/project/issues/I1402.yaml. Načtěte ho zpět pomocí majordomus plan show I1402.