feat(ink): streekidentiteit en een grafsteen bij wissen (#541) #748

Merged
brenno merged 1 commit from feat/ink-naar-git-541 into main 2026-07-23 14:17:10 +00:00
Owner

De formaathelft van de ink-merge — de eerste stap in de volgorde die D7 voorschrijft: eerst het annotatieformaat, dan de driver, dan het schrijfpad.

Elke streek draagt nu een id. De merge vereent de streken van twee kanten, en een unie moet weten wélke streken dezelfde zijn. Zonder identiteit is het enige houvast de puntenlijst, en verenigen twee kopieën van dezelfde tekening tot een dubbel getrokken lijn.

Wissen zet een grafsteen in plaats van weg te gooien. Hier is de intuïtie fout. Weggooien is wat je verwacht, en het is precies verkeerd zodra het bestand gemerged wordt: de andere kant heeft de streek nog, de unie brengt hem terug, en de gebruiker zág hem verdwijnen. Een verwijdering die terugkomt is erger dan een die niet werkt. De tekenaar slaat een gemarkeerde streek over, dus op het scherm verandert er niets.

Versie 2, met een leespad. Een sidecar van versie 1 leest door en krijgt verse ids. Eén eerlijk gevolg staat in de code: twee kopieën van zon oud bestand krijgen verschillende ids en verenigen tot dubbele lijnen. Zichtbaar en herstelbaar — beter dan stil één kant laten vallen.

Een test die dat verdiende viel om. sidecar_version_test noemde versie 2 "uit de toekomst"; dat is nu de huidige. De toetsen staan op Codec.version + 1, zodat ze bij de volgende formaatwijziging niet opnieuw stilletjes de verkeerde vraag stellen.

De uniemergeregel staat als eigenschap in de nieuwe tests — inclusief een gewiste streek komt niet terug — zodat het formaat niet kan wegdrijven van wat de driver straks nodig heeft.

8 nieuwe tests; make check groen: 6007 tests.

Nog open in #541: de driver merge=ocideck-ink (die ook in de app reproduceerbaar moet zijn), het schrijfpad naar de repo, en het zegel — dat wacht op de keuze uit D13.

De formaathelft van de ink-merge — de eerste stap in de volgorde die D7 voorschrijft: eerst het annotatieformaat, dan de driver, dan het schrijfpad. **Elke streek draagt nu een id.** De merge vereent de streken van twee kanten, en een unie moet weten wélke streken dezelfde zijn. Zonder identiteit is het enige houvast de puntenlijst, en verenigen twee kopieën van dezelfde tekening tot een dubbel getrokken lijn. **Wissen zet een grafsteen in plaats van weg te gooien.** Hier is de intuïtie fout. Weggooien is wat je verwacht, en het is precies verkeerd zodra het bestand gemerged wordt: de andere kant heeft de streek nog, de unie brengt hem terug, en de gebruiker zág hem verdwijnen. Een verwijdering die terugkomt is erger dan een die niet werkt. De tekenaar slaat een gemarkeerde streek over, dus op het scherm verandert er niets. **Versie 2, met een leespad.** Een sidecar van versie 1 leest door en krijgt verse ids. Eén eerlijk gevolg staat in de code: twee kopieën van zon oud bestand krijgen verschillende ids en verenigen tot dubbele lijnen. Zichtbaar en herstelbaar — beter dan stil één kant laten vallen. **Een test die dat verdiende viel om.** `sidecar_version_test` noemde versie 2 "uit de toekomst"; dat is nu de huidige. De toetsen staan op `Codec.version + 1`, zodat ze bij de volgende formaatwijziging niet opnieuw stilletjes de verkeerde vraag stellen. De uniemergeregel staat als eigenschap in de nieuwe tests — inclusief *een gewiste streek komt niet terug* — zodat het formaat niet kan wegdrijven van wat de driver straks nodig heeft. 8 nieuwe tests; `make check` groen: 6007 tests. **Nog open in #541:** de driver `merge=ocideck-ink` (die ook in de app reproduceerbaar moet zijn), het schrijfpad naar de repo, en het zegel — dat wacht op de keuze uit D13.
De formaathelft van de ink-merge, en de eerste stap in de volgorde die D7
voorschrijft: eerst het annotatieformaat, dan de driver, dan het
schrijfpad.

**Elke streek draagt nu een `id`.** De merge vereent de streken van twee
kanten — twee mensen die op één dia tekenen zijn het niet oneens — en een
unie moet weten wélke streken dezelfde zijn. Zonder identiteit is het
enige houvast de puntenlijst, en verenigen twee kopieën van dezelfde
tekening tot een dubbel getrokken lijn.

**Wissen zet een grafsteen in plaats van weg te gooien.** Dit is de plek
waar de intuïtie fout is. Weggooien is wat je verwacht, en het is precies
verkeerd zodra het bestand gemerged wordt: de andere kant heeft de streek
nog, de unie brengt hem terug, en de gebruiker zág hem verdwijnen. Een
verwijdering die terugkomt is erger dan een die niet werkt. De tekenaar
slaat een gemarkeerde streek over, dus op het scherm verandert er niets.

`erased` wordt alleen geschreven wanneer het waar is: het gewone geval is
een streek die er gewoon is, en een bestand vol `"erased": false` is ruis
in iets dat mensen in een diff lezen.

**Versie 2, met een leespad.** Een sidecar van versie 1 leest door en elke
streek krijgt een verse id. Dat heeft één eerlijk gevolg, en het staat in
de code: twee kopieën van zo'n oud bestand krijgen verschillende ids en
verenigen tot dubbele lijnen. Zichtbaar en herstelbaar — beter dan stil
één van beide kanten laten vallen. Andersom leest niet: een oudere build
zou de grafstenen niet begrijpen en gewiste streken weer tekenen.

**Een test die dat verdiende viel om.** `sidecar_version_test` noemde
versie 2 "uit de toekomst"; dat is nu de huidige. De toetsen staan op
`Codec.version + 1`, zodat ze bij de volgende formaatwijziging niet
opnieuw stilletjes de verkeerde vraag stellen.

De uniemergeregel staat als eigenschap in de nieuwe tests — inclusief "een
gewiste streek komt niet terug" — zodat het formaat niet kan wegdrijven
van wat de driver straks nodig heeft.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit bb84ae0572 into main 2026-07-23 14:17:10 +00:00
brenno deleted branch feat/ink-naar-git-541 2026-07-23 14:17:11 +00:00
Sign in to join this conversation.
No description provided.