refactor(git): het offline parkeren en uitpakken uit de state-laag (#518) #725

Merged
brenno merged 3 commits from refactor/git-wachtrij-uit-state-518 into main 2026-07-23 11:04:13 +00:00
Owner

De laatste twee die #518 nog noemde: _queueGitSave en _poolPendingDeck, privémethoden op TabsNotifier.

Ze zijn geen toestandswerk. Er komt geen tabblad, geen Riverpod en geen huidige selectie aan te pas — alleen een werkkopie, een outbox en een forge. Nu queueDeckSave en poolPendingDeck in services/git/offline_queue.dart.

Eén bestand, en dat is geen ordening op grootte maar op contract. Wat het parkeren bewust ongepoold wegschrijft — mem:-verwijzingen, omdat de blobs offline toch niet omhoog kunnen en hun bytes nog in het geheugen staan — is precies wat het poolen vlak vóór de commit alsnog moet omzetten. Die afspraak stond nergens opgeschreven, en uit elkaar gehaald zou ze nergens meer staan.

Wat achterbleef, bleef bewust achter. De wachtrijteller ongeldig maken zodat de badge meebeweegt, en de waarschuwingen die bij dat ene opslagverzoek horen: dát is toestandswerk. Vandaar dat _queueGitSave blijft bestaan als dun laagje eromheen in plaats van te verdwijnen.

Waarom dit meer is dan verplaatsen. Beide waren alleen te bereiken via een opslagronde van de notifier. Ze zijn nu rechtstreeks te toetsen, en die tests staan erbij. Ze bewaken drie dingen die stil misgaan:

  • de werkkopie houdt de mem:-verwijzing ongepoold — dat is de afspraak tussen de twee helften;
  • de lagen naast deck.md overleven het poolen — zonder dat verliest wachtend werk zijn notities net op het moment dat het landt;
  • een werkkopie die het deck weigert laat géén halve wachtrij achter. Dat was ooit een echt gat: DraftStoreUnsupported is geen GitForgeException, dus zonder de vangst liep hij ongevangen door.

Onderweg verhuisde repoAssetBytes mee naar repo_asset_resolver.dart (eigen commit), naast zijn spiegelbeeld: die functie leest een repo-asset terug naar het geheugen, deze levert de bytes die er naartoe gaan.

TabsNotifier van 2.251 naar 2.210 regels, ratchet mee omlaag.

Poort: make check groen, gedraaid ná de rebase op main met #723 (de toolchainpoort) erin.

Refs #518

De laatste twee die #518 nog noemde: `_queueGitSave` en `_poolPendingDeck`, privémethoden op `TabsNotifier`. **Ze zijn geen toestandswerk.** Er komt geen tabblad, geen Riverpod en geen huidige selectie aan te pas — alleen een werkkopie, een outbox en een forge. Nu `queueDeckSave` en `poolPendingDeck` in `services/git/offline_queue.dart`. **Eén bestand, en dat is geen ordening op grootte maar op contract.** Wat het parkeren bewust ongepoold wegschrijft — `mem:`-verwijzingen, omdat de blobs offline toch niet omhoog kunnen en hun bytes nog in het geheugen staan — is precies wat het poolen vlak vóór de commit alsnog moet omzetten. Die afspraak stond nergens opgeschreven, en uit elkaar gehaald zou ze nergens meer staan. **Wat achterbleef, bleef bewust achter.** De wachtrijteller ongeldig maken zodat de badge meebeweegt, en de waarschuwingen die bij dat ene opslagverzoek horen: dát is toestandswerk. Vandaar dat `_queueGitSave` blijft bestaan als dun laagje eromheen in plaats van te verdwijnen. **Waarom dit meer is dan verplaatsen.** Beide waren alleen te bereiken via een opslagronde van de notifier. Ze zijn nu rechtstreeks te toetsen, en die tests staan erbij. Ze bewaken drie dingen die stil misgaan: - de werkkopie houdt de `mem:`-verwijzing ongepoold — dat is de afspraak tussen de twee helften; - de lagen naast `deck.md` overleven het poolen — zonder dat verliest wachtend werk zijn notities net op het moment dat het landt; - een werkkopie die het deck weigert laat géén halve wachtrij achter. Dat was ooit een echt gat: `DraftStoreUnsupported` is geen `GitForgeException`, dus zonder de vangst liep hij ongevangen door. Onderweg verhuisde `repoAssetBytes` mee naar `repo_asset_resolver.dart` (eigen commit), naast zijn spiegelbeeld: die functie leest een repo-asset terug naar het geheugen, deze levert de bytes die er naartoe gaan. `TabsNotifier` van 2.251 naar 2.210 regels, ratchet mee omlaag. Poort: `make check` groen, gedraaid ná de rebase op main met #723 (de toolchainpoort) erin. Refs #518
Waar de bytes van een afbeelding vandaan komen bij het schrijven naar een repo
— webstore bij een `mem:`-pad, anders schijf — is opslagwerk en geen
toestandswerk. Het stond als privéfunctie in `tabs_provider_git.dart`.

Nu in `repo_asset_resolver.dart`, naast zijn spiegelbeeld: `resolveRepoAssetsToMem`
leest een repo-asset terug naar het geheugen, `repoAssetBytes` levert de bytes
die er naartoe gaan. Twee richtingen van hetzelfde onderwerp horen bij elkaar.

Vooruitwerk voor de verhuizing van de wachtrijfuncties: die hebben hem nodig en
konden hem vanuit de servicelaag niet bereiken.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
De laatste twee die het issue noemde: `_queueGitSave` en `_poolPendingDeck`,
privémethoden op `TabsNotifier`. Ze zijn geen toestandswerk — er komt geen
tabblad, geen Riverpod en geen huidige selectie aan te pas, alleen een
werkkopie, een outbox en een forge.

Nu `queueDeckSave` en `poolPendingDeck` in `services/git/offline_queue.dart`,
in één bestand. Dat is geen ordening op grootte maar op contract: wat het
parkeren bewust ongepoold wegschrijft — `mem:`-verwijzingen, omdat de blobs
offline toch niet omhoog kunnen en hun bytes nog in het geheugen staan — is
precies wat het poolen vlak vóór de commit alsnog moet omzetten. Die afspraak
stond nergens anders opgeschreven, en uit elkaar gehaald zou ze nergens meer
staan.

Wat er wél toestandswerk aan was, is achtergebleven waar het hoort: de
wachtrijteller ongeldig maken zodat de badge meebeweegt, en de waarschuwingen
die bij dat ene opslagverzoek horen. Vandaar dat `_queueGitSave` blijft bestaan
als dun laagje eromheen in plaats van te verdwijnen.

`TabsNotifier` van 2251 naar 2210 regels, ratchet mee omlaag.

**Waarom dit meer is dan verplaatsen.** Beide waren alleen te bereiken via een
opslagronde van de notifier; nu zijn ze rechtstreeks te toetsen, en die tests
staan erbij. Ze bewaken drie dingen die stil misgaan: dat de werkkopie de
mem:-verwijzing ongepoold houdt (de afspraak tussen de twee helften), dat de
lagen naast `deck.md` het poolen overleven — zonder dat verliest wachtend werk
zijn notities net als het landt — en dat een werkkopie die het deck weigert
géén halve wachtrij achterlaat.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SOURCE_MAP krijgt een regel voor `offline_queue.dart` mét de reden dat het één
bestand is, en `repo_asset_resolver.dart` krijgt zijn tweede richting erbij.
CHANGELOG noemt wat er achterbleef in de state-laag en waarom.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit f2c75d0918 into main 2026-07-23 11:04:13 +00:00
Sign in to join this conversation.
No description provided.