refactor(git): guard-basis en merge-na-conflict uit de state-laag, met de scanners eindelijk gedraaid (#518) #679

Merged
brenno merged 2 commits from refactor/git-uit-state-2 into main 2026-07-22 20:05:56 +00:00
Owner

Tweede hap uit #518, en de laatste die ik zinnig alleen kan doen — zie Wat overblijft.

Twee verplaatsingen die de issue met naam noemt

De issue zegt: "git orchestration still lives in the state layer: saving, merge-on-conflict, the queue and asset pooling sit in state/tabs_provider_git.dart rather than services/git/." Hier gaan er twee van weg.

roundBaseSha hoort bij workBranchFor (uit #674): dezelfde vraag, tweede helft. De eerste kiest de branch, de tweede bepaalt de commit waar de guard tegenaan botst — en dáár zit de verrassing. Bestaat de werkbranch van vandaag al (een tweede ronde, of een collega die eerder was), dan nemen we zijn kop juist niet over: dat zou de guard per definitie tevreden maken en we schreven weg wat daar staat. Vier tests; twee daarvan werden rood tegen een geplante mutatie.

mergeIntoRemote is de opslagkern van _mergeOnConflict: lees hun kant en de voorouder, voeg samen, commit als het schoon ging. Wat in de state-laag achterblijft is wat daar hoort — het deck in het tabblad zetten en de herkomst bijwerken.

Een fout die de bestaande test ving

Bij die tweede verplaatsing liet ik de herkomst staan wanneer de merge niet schoon was. Dat is verkeerd, en git_merge_on_conflict_test zei het meteen.

De gebruiker kijkt vanaf dat moment naar een deck dat tegen húń kop is samengevoegd. Blijft de oude basis staan, dan botst zijn volgende opslag — ná het beslechten van de conflicten — tegen een voorouder die hij allang voorbij is. head reist daarom mee in de teruggave, mét die reden erbij, zodat het niet nog eens gebeurt.

Botsing met een parallelle sessie

Deze tak botste bij het rebasen met #676, die #670 oploste — het issue dat ik gisteren indiende. Drie conflicten, elk met een eigen juiste uitkomst:

  • tabs_provider_git.dart — zij centraliseerden de afbeeldingsbytes in _repoAssetBytes, ik verplaatste het hele blok. Mijn verplaatsing wint structureel, maar hún helper is nu wat mijn callback aanroept: geen zesde kopie van dezelfde regel.
  • SOURCE_MAP.md — beide kanten voegden iets waars toe aan dezelfde regel. Samengevoegd, niet gekozen.
  • check_conventions.dart — twee verschillende basislijnen voor TabsNotifier, elk gemeten op een andere boom. Geen van beide overgenomen: opnieuw gemeten ná het oplossen. 2254.

Bij het samenvoegen van die SOURCE_MAP-regel at ik een regeleinde op, waardoor een andere regel aan zijn buurman vastplakte. De dekkingspoort ving dat — hij toetst of elke library een eigen regel heeft, en een samengeplakte regel is er nul. Aparte commit, want het is een leerzame fout en geen ruis.

Getoetst

  • make check groen na de rebase op de huidige main.
  • make check-secrets en make sast zijn voor het eerst écht gedraaid — gitleaks, trufflehog en semgrep staan nu op deze machine. Nul bevindingen.
  • En omdat "nul bevindingen" pas iets zegt als de regels ook afgaan: alle drie de semgrep-regels getoetst tegen een geplante overtreding. Alle drie gingen af, en nul op de repo. Die tweede richting stond in de skill als valkuil en was hier nooit gedaan.

Wat van #518 overblijft

saveToGit is de grootste die er nog staat, maar dat is geen misplaatste code: die leest het huidige tabblad, zet de herkomst en roept refreshTabs(). Dat ís state-werk. Wat eruit kon is er inmiddels uit.

Wat er dan nog ligt:

  • De wachtrij en de asset-pooling die de issue noemt — _queueGitSave en _poolPendingDeck. Kleiner dan ze klonken, en mirrorDeckFiles (uit #673) haalde het hart er al uit.
  • app_shell blijft groot; het per-klasse-plafond bewaakt het inmiddels.
  • Geen poort op de commentaartaalregel. CONTRIBUTING zegt het, niets meet het.

TabsNotifier staat na deze twee PR's op 2254 regels, tegen 2395 bij het begin van de dag. Elke verlaging is een gemeten waarde ná de rebase, niet ervoor — die fout heb ik vandaag twee keer gemaakt en de tweede keer ving de poort hem.

Werkt aan #518; die blijft open voor de rest.

Tweede hap uit #518, en de laatste die ik zinnig alleen kan doen — zie *Wat overblijft*. ## Twee verplaatsingen die de issue met naam noemt De issue zegt: *"git orchestration still lives in the state layer: saving, merge-on-conflict, the queue and asset pooling sit in `state/tabs_provider_git.dart` rather than `services/git/`."* Hier gaan er twee van weg. **`roundBaseSha`** hoort bij `workBranchFor` (uit #674): dezelfde vraag, tweede helft. De eerste kiest de branch, de tweede bepaalt de commit waar de guard tegenaan botst — en dáár zit de verrassing. Bestaat de werkbranch van vandaag al (een tweede ronde, of een collega die eerder was), dan nemen we zijn kop **juist niet** over: dat zou de guard per definitie tevreden maken en we schreven weg wat daar staat. Vier tests; twee daarvan werden rood tegen een geplante mutatie. **`mergeIntoRemote`** is de opslagkern van `_mergeOnConflict`: lees hun kant en de voorouder, voeg samen, commit als het schoon ging. Wat in de state-laag achterblijft is wat daar hoort — het deck in het tabblad zetten en de herkomst bijwerken. ## Een fout die de bestaande test ving Bij die tweede verplaatsing liet ik de herkomst staan wanneer de merge **niet** schoon was. Dat is verkeerd, en `git_merge_on_conflict_test` zei het meteen. De gebruiker kijkt vanaf dat moment naar een deck dat tegen húń kop is samengevoegd. Blijft de oude basis staan, dan botst zijn volgende opslag — ná het beslechten van de conflicten — tegen een voorouder die hij allang voorbij is. `head` reist daarom mee in de teruggave, mét die reden erbij, zodat het niet nog eens gebeurt. ## Botsing met een parallelle sessie Deze tak botste bij het rebasen met [#676](https://pawprint.vigilis.online/LibreKAT/Ocideck/pulls/676), die #670 oploste — het issue dat ik gisteren indiende. Drie conflicten, elk met een eigen juiste uitkomst: - **`tabs_provider_git.dart`** — zij centraliseerden de afbeeldingsbytes in `_repoAssetBytes`, ik verplaatste het hele blok. Mijn verplaatsing wint structureel, maar hún helper is nu wat mijn callback aanroept: geen zesde kopie van dezelfde regel. - **`SOURCE_MAP.md`** — beide kanten voegden iets waars toe aan dezelfde regel. Samengevoegd, niet gekozen. - **`check_conventions.dart`** — twee verschillende basislijnen voor `TabsNotifier`, elk gemeten op een andere boom. Geen van beide overgenomen: opnieuw gemeten ná het oplossen. 2254. Bij het samenvoegen van die SOURCE_MAP-regel at ik een regeleinde op, waardoor een andere regel aan zijn buurman vastplakte. De dekkingspoort ving dat — hij toetst of elke library een eigen regel heeft, en een samengeplakte regel is er nul. Aparte commit, want het is een leerzame fout en geen ruis. ## Getoetst - `make check` groen na de rebase op de huidige main. - **`make check-secrets` en `make sast` zijn voor het eerst écht gedraaid** — gitleaks, trufflehog en semgrep staan nu op deze machine. Nul bevindingen. - En omdat "nul bevindingen" pas iets zegt als de regels ook afgaan: alle drie de semgrep-regels getoetst tegen een geplante overtreding. Alle drie gingen af, en nul op de repo. Die tweede richting stond in de skill als valkuil en was hier nooit gedaan. ## Wat van #518 overblijft `saveToGit` is de grootste die er nog staat, maar dat is **geen misplaatste code**: die leest het huidige tabblad, zet de herkomst en roept `refreshTabs()`. Dat ís state-werk. Wat eruit kon is er inmiddels uit. Wat er dan nog ligt: - **De wachtrij en de asset-pooling** die de issue noemt — `_queueGitSave` en `_poolPendingDeck`. Kleiner dan ze klonken, en `mirrorDeckFiles` (uit #673) haalde het hart er al uit. - **`app_shell`** blijft groot; het per-klasse-plafond bewaakt het inmiddels. - **Geen poort op de commentaartaalregel.** CONTRIBUTING zegt het, niets meet het. `TabsNotifier` staat na deze twee PR's op 2254 regels, tegen 2395 bij het begin van de dag. Elke verlaging is een gemeten waarde ná de rebase, niet ervoor — die fout heb ik vandaag twee keer gemaakt en de tweede keer ving de poort hem. Werkt aan #518; die blijft open voor de rest.
Twee verplaatsingen die de issue met naam noemt ("saving, merge-on-conflict,
the queue and asset pooling sit in state/ rather than services/git/").

**`roundBaseSha`** hoort bij `workBranchFor`: dezelfde vraag, tweede helft.
`workBranchFor` kiest de branch, `roundBaseSha` bepaalt de commit waar de guard
tegenaan botst — en dat is precies het stuk met een verrassing erin: bestaat de
werkbranch van vandaag al (een tweede ronde, of een collega die eerder was), dan
nemen we zijn kop juist NIET over. Die overnemen zou de guard per definitie
tevreden maken en we schreven weg wat daar staat. Vier tests, waarvan twee rood
werden tegen een geplante mutatie.

**`mergeIntoRemote`** is de opslagkern van `_mergeOnConflict`: lees hun kant en
de voorouder, voeg samen, en commit als het schoon ging. Wat in de state-laag
achterblijft is wat daar hoort — het deck in het tabblad zetten en de herkomst
bijwerken.

Bij die tweede maakte ik onderweg een echte fout, en de bestaande test ving hem:
ik liet de herkomst staan wanneer de merge níét schoon was. Dat is verkeerd. De
gebruiker kijkt vanaf dat moment naar een deck dat tegen húń kop is samengevoegd,
dus die kop moet de nieuwe basis worden — anders botst zijn volgende opslag,
ná het beslechten, tegen een voorouder die hij allang voorbij is. `head` reist
daarom mee in de teruggave, met de reden erbij.

`TabsNotifier` zakt van 2325 naar 2264; de basislijn zakt mee.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix(docs): herstel het regeleinde dat de conflictoplossing opat (#518)
Some checks failed
CI / Gate (Linux) · Format · Analyze · Coverage (push) Failing after 24s
CI / Web hardening (push) Failing after 25s
CI / Docs links (push) Failing after 26s
CI / Supply-chain (Trivy · advisory) (push) Failing after 25s
CI / Gate (Linux) · Format · Analyze · Coverage (pull_request) Failing after 26s
CI / Web hardening (pull_request) Failing after 29s
CI / Docs links (pull_request) Failing after 28s
CI / Supply-chain (Trivy · advisory) (pull_request) Failing after 28s
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Test (macos-latest) (pull_request) Has been cancelled
CI / Test (windows-latest) (pull_request) Has been cancelled
a21bbc67a2
Bij het samenvoegen van twee SOURCE_MAP-regels sneed ik een regeleinde weg,
waardoor de regel over deck_mirror.dart aan zijn buurman vastplakte en de
dekkingspoort hem niet meer als eigen regel zag.

De poort ving het. Dat is precies waarvoor hij bestaat: hij toetst niet of de
tekst mooi is maar of elke library er één heeft, en een samengeplakte regel is
er nul.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 18761c74a9 into main 2026-07-22 20:05:56 +00:00
Sign in to join this conversation.
No description provided.