[Feature] Structural debt: layering, class size, SOURCE_MAP #518

Closed
opened 2026-07-22 09:28:35 +00:00 by brenno · 5 comments
Owner

Structural debt from the release review. None of it blocks a release; all of it decides how expensive the next year is.

  • Layer direction is now gated (layerRules in check_conventions.dart, hard zero) — but 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/.
  • The file-size ratchet counts files, not classes. TabsNotifier is ~2,800 lines across seven part files and DeckNotifier ~1,400; the part split quieted the gate while the class kept growing. Consider a per-class ceiling.
  • app_shell is ~7,300 lines across 18 files, with git dialogs and storage orchestration sharing private scope.
  • SOURCE_MAP.md claims a line per lib/ file and was missing 156 of them at review time. Either complete it or narrow the claim — a map that is silently partial is worse than one that says what it covers.
  • Comments are roughly half Dutch, half English within the same files, and CONTRIBUTING.md has no rule for it (only for l10n).

Do this when the tree is quiet: it moves code across many files and is the most expensive branch to rebase. Weigh each item on whether it makes the next change cheaper, not on tidiness.

Structural debt from the release review. None of it blocks a release; all of it decides how expensive the next year is. - **Layer direction is now gated** (`layerRules` in `check_conventions.dart`, hard zero) — but 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/`. - **The file-size ratchet counts files, not classes.** `TabsNotifier` is ~2,800 lines across seven `part` files and `DeckNotifier` ~1,400; the `part` split quieted the gate while the class kept growing. Consider a per-class ceiling. - **`app_shell` is ~7,300 lines across 18 files**, with git dialogs and storage orchestration sharing private scope. - **`SOURCE_MAP.md` claims a line per `lib/` file** and was missing 156 of them at review time. Either complete it or narrow the claim — a map that is silently partial is worse than one that says what it covers. - **Comments are roughly half Dutch, half English within the same files**, and `CONTRIBUTING.md` has no rule for it (only for l10n). Do this when the tree is quiet: it moves code across many files and is the most expensive branch to rebase. Weigh each item on whether it makes the next change cheaper, not on tidiness.
Author
Owner

Eerste hap op main: 89df3e39 (PR #674) — de werkbranch-keuze (D3) uit TabsNotifier naar lib/services/git/work_branch.dart, met acht tests op een functie die er nul had. TabsNotifier zakt van 2395 naar 2325; de basislijn zakt mee.

Daarvóór, als bijvangst van #541: het hele native merge-oplosblok naar resolveRepoDeckMerge in de servicelaag, en het opbouwen van de werkkopie naar mirrorDeckFiles. Beide keren wees de klasseratchet de weg — die viel, en had gelijk.

Drie van de vijf punten hierboven bleken al gedaan toen ik ze tegen de code toetste:

  • het per-klasse-plafond bestáát (maxClassLines + classSizeBaseline in check_conventions.dart), dus "de ratchet telt bestanden, niet klassen" klopt niet meer;
  • de SOURCE_MAP-claim is versmald én afgedwongen (source_map_coverage_test.dart, vier regels);
  • de commentaartaalregel staat in CONTRIBUTING ("Dutch or English, but never both in one comment").

Wat open blijft:

  • Meer git-orkestratie uit lib/state/. saveToGit (164 regels) en _mergeOnConflict (143) zijn de volgende, en dat zijn verplaatsingen mét gedrag — elk zijn eigen PR met eigen tests.
  • app_shell blijft groot. Het per-klasse-plafond bewaakt het inmiddels wel, dus dit is geen schuld die groeit.
  • Geen poort op de commentaartaalregel. CONTRIBUTING zegt het, niets meet het.

Eén aantekening over de aanpak: de issue zegt "do this when the tree is quiet". Dat was hij niet — main verschoof zes keer tijdens deze sessie. Vandaar één verplaatsing per PR in plaats van één grote tak; die had ik drie keer moeten rebasen.

Eerste hap op main: `89df3e39` (PR #674) — de werkbranch-keuze (D3) uit `TabsNotifier` naar `lib/services/git/work_branch.dart`, met acht tests op een functie die er nul had. `TabsNotifier` zakt van 2395 naar 2325; de basislijn zakt mee. Daarvóór, als bijvangst van #541: het hele native merge-oplosblok naar `resolveRepoDeckMerge` in de servicelaag, en het opbouwen van de werkkopie naar `mirrorDeckFiles`. Beide keren wees de klasseratchet de weg — die viel, en had gelijk. **Drie van de vijf punten hierboven bleken al gedaan** toen ik ze tegen de code toetste: - het per-klasse-plafond bestáát (`maxClassLines` + `classSizeBaseline` in `check_conventions.dart`), dus "de ratchet telt bestanden, niet klassen" klopt niet meer; - de SOURCE_MAP-claim is versmald én afgedwongen (`source_map_coverage_test.dart`, vier regels); - de commentaartaalregel staat in CONTRIBUTING ("Dutch or English, but never both in one comment"). **Wat open blijft:** - **Meer git-orkestratie uit `lib/state/`.** `saveToGit` (164 regels) en `_mergeOnConflict` (143) zijn de volgende, en dat zijn verplaatsingen mét gedrag — elk zijn eigen PR met eigen tests. - **`app_shell`** blijft groot. Het per-klasse-plafond bewaakt het inmiddels wel, dus dit is geen schuld die groeit. - **Geen poort op de commentaartaalregel.** CONTRIBUTING zegt het, niets meet het. Eén aantekening over de aanpak: de issue zegt "do this when the tree is quiet". Dat was hij niet — main verschoof zes keer tijdens deze sessie. Vandaar één verplaatsing per PR in plaats van één grote tak; die had ik drie keer moeten rebasen.
Author
Owner

Tweede hap op main: 1ce550a2 (PR #679) — roundBaseSha en mergeIntoRemote uit de state-laag. TabsNotifier staat nu op 2254 regels, tegen 2395 bij het begin van vandaag.

saveToGit blijft staan, en dat is geen schuld. Die leest het huidige tabblad, zet de herkomst en roept refreshTabs() — dat ís state-werk. Wat eruit kon (de branchkeuze, de guard-basis, het samenvoegen, het opbouwen van de bestandenset, de werkkopie) is er inmiddels uit. De issue-tekst noemt saveToGit als misplaatst; dat klopt niet meer, en dat is een correctie op het issue en niet op de code.

Wat werkelijk overblijft:

  • _queueGitSave en _poolPendingDeck — kleiner dan ze klonken; mirrorDeckFiles haalde het hart er al uit.
  • app_shell blijft groot, maar wordt door het per-klasse-plafond bewaakt en groeit dus niet ongemerkt.
  • Geen poort op de commentaartaalregel. CONTRIBUTING zegt het, niets meet het. Dat is de enige van de vijf oorspronkelijke punten waar nog niets voor staat.

Twee dingen over de aanpak die het waard zijn te onthouden.

Deze tak botste met #676 (de oplossing van #670, uit een parallelle sessie). Drie conflicten met elk een andere juiste uitkomst: hun helper overnemen in mijn verplaatsing, beide toevoegingen aan één SOURCE_MAP-regel samenvoegen, en de basislijn opnieuw méten in plaats van een van beide te kiezen. Die derde is de valkuil — ik heb vandaag twee keer een basislijn gezet op een meting van vóór een rebase, en beide keren viel de poort.

En de scanners staan nu. make check-secrets en make sast draaiden voor het eerst echt: nul bevindingen. Belangrijker: ik heb alle drie de semgrep-regels getoetst tegen een geplante overtreding, want nul bevindingen zegt niets als de regels niet afgaan. Alle drie gingen af. Die tweede richting stond als valkuil in de skill en was hier nooit gedaan.

Tweede hap op main: `1ce550a2` (PR #679) — `roundBaseSha` en `mergeIntoRemote` uit de state-laag. `TabsNotifier` staat nu op **2254** regels, tegen 2395 bij het begin van vandaag. **`saveToGit` blijft staan, en dat is geen schuld.** Die leest het huidige tabblad, zet de herkomst en roept `refreshTabs()` — dat ís state-werk. Wat eruit kon (de branchkeuze, de guard-basis, het samenvoegen, het opbouwen van de bestandenset, de werkkopie) is er inmiddels uit. De issue-tekst noemt `saveToGit` als misplaatst; dat klopt niet meer, en dat is een correctie op het issue en niet op de code. **Wat werkelijk overblijft:** - `_queueGitSave` en `_poolPendingDeck` — kleiner dan ze klonken; `mirrorDeckFiles` haalde het hart er al uit. - `app_shell` blijft groot, maar wordt door het per-klasse-plafond bewaakt en groeit dus niet ongemerkt. - Geen poort op de commentaartaalregel. CONTRIBUTING zegt het, niets meet het. Dat is de enige van de vijf oorspronkelijke punten waar nog niets voor staat. **Twee dingen over de aanpak die het waard zijn te onthouden.** Deze tak botste met #676 (de oplossing van #670, uit een parallelle sessie). Drie conflicten met elk een andere juiste uitkomst: hun helper overnemen in mijn verplaatsing, beide toevoegingen aan één SOURCE_MAP-regel samenvoegen, en de basislijn opnieuw méten in plaats van een van beide te kiezen. Die derde is de valkuil — ik heb vandaag twee keer een basislijn gezet op een meting van vóór een rebase, en beide keren viel de poort. **En de scanners staan nu.** `make check-secrets` en `make sast` draaiden voor het eerst echt: nul bevindingen. Belangrijker: ik heb alle drie de semgrep-regels getoetst tegen een geplante overtreding, want nul bevindingen zegt niets als de regels niet afgaan. Alle drie gingen af. Die tweede richting stond als valkuil in de skill en was hier nooit gedaan.
Author
Owner

Opgepakt. Tak: feat/poort-commentaartaal-518. Ik neem het punt dat volgens je eigen tussenstand als enige van de vijf nog helemaal zonder poort staat: CONTRIBUTING zegt "Dutch or English, but never both in one comment" en niets meet dat. Reikwijdte: een controle in tool/ met een basislijn, plus de registratie in de Makefile en docs/CHECKS.md. _queueGitSave/_poolPendingDeck laat ik in deze ronde staan; dat zijn verplaatsingen mét gedrag en die horen hun eigen PR te krijgen.

Opgepakt. Tak: `feat/poort-commentaartaal-518`. Ik neem het punt dat volgens je eigen tussenstand als enige van de vijf nog helemaal zonder poort staat: CONTRIBUTING zegt "Dutch or English, but never both in one comment" en niets meet dat. Reikwijdte: een controle in `tool/` met een basislijn, plus de registratie in de Makefile en `docs/CHECKS.md`. `_queueGitSave`/`_poolPendingDeck` laat ik in deze ronde staan; dat zijn verplaatsingen mét gedrag en die horen hun eigen PR te krijgen.
Author
Owner

Derde hap op main: `4fa0cd23` (PR #720) — de commentaartaalpoort. Dat was volgens je eigen tussenstand het enige van de vijf punten waar nog helemaal niets voor stond.

De vraag was eerst óf dit te bewaken valt. CONTRIBUTING schrijft er zelf bij dat een taalheuristiek die er 5% naast zit slechter is dan geen poort. Dat oordeel klopt — voor classificeren: dan moet élk blok een antwoord krijgen en telt elke twijfel mee. Mengdetectie is een andere vraag. Die zwijgt tenzij er van béide talen hard bewijs is, dus twijfel levert stilte op in plaats van een vals alarm. Dat is de reden dat dít wél kan en de taalkeuze niet, en het staat als zodanig in de poort en in CHECKS.md.

Wat de meting opleverde. 47 ruwe treffers, allemaal met de hand nagekeken:

  • 37 zijn dartdoc met een Engelse samenvattingsregel boven een Nederlandse redenering. Dat is precies de vorm die CONTRIBUTING elders vóórschrijft voor publieke types in lib/models en lib/services — de laag die dart doc, pub.dev en de IDE tonen. Een poort die de bijdragersgids beboet, wordt uitgezet. Dartdoc valt er dus buiten, en dat is geen gemakzucht maar de enige uitkomst die met de rest van de gids klopt.
  • De 10 gewone commentaarblokken zijn allemaal echt. Van een Engelse alinea met een Nederlandse eronder tot één zin die in het Engels begint en in het Nederlands afloopt (shell_actions.dart:81).

Die tien werk ik niet weg, en dat is met opzet: dezelfde gids verbiedt commentaar herschrijven alléén om de taal te wijzigen — duizenden regels ruis met andermans redenering onder mijn naam in git blame. Ze staan als ratchet en zakken vanzelf zodra iemand er om een andere reden aankomt.

De poort is in beide richtingen getoetst, want groen zegt niets als de regel niet afgaat. Met een geplante overtreding valt hij, en na terugdraaien is hij weer groen. Dat was geen formaliteit: mijn eerste versie ging er níét van af. Een hoofdletterfilter — bedoeld om typenamen als Widget te weren — gooide juist het sterkste signaal weg, namelijk "The …" aan het begin van een zin. Zonder die toets was dat gat blijven zitten en had de poort er groen bijgestaan zonder iets te meten. Die valkuil noemde je zelf in je vorige reactie over de semgrep-regels.

Bijvangst: een echte fout. De dartdoc van parseDer zat vastgeplakt bovenop die van _maxDerDepth — de constante droeg een samenvatting die niet over haar ging, de functie had er helemaal geen. De poort viel erover als "een blok dat halverwege van taal wisselt", en dat wás het ook; de oorzaak zat alleen een laag dieper dan een taalkeuze.

Geregistreerd waar het hoort: Makefile (eigen doel, in check), docs/CHECKS.md (rij plus de hele afweging), check_ratchet_trend.dart zodat make ratchets hem meeneemt, en CONTRIBUTING. De aantekening daar die zei dat er nog geen poort was, is niet weggehaald maar aangevuld: dat oordeel gold de dartdoc-clausule en geldt daar nog steeds — het is precies de reden dat de poort die overslaat.

Wat er van dit issue overblijft:

  • _queueGitSave en _poolPendingDeck uit de state-laag. Ik heb ze in deze ronde bewust laten staan: dat zijn verplaatsingen mét gedrag, en die horen hun eigen PR met eigen tests te krijgen.
  • app_shell blijft groot, maar wordt door het per-klasse-plafond bewaakt en groeit dus niet ongemerkt. Dat is geen schuld die oploopt.

Daarmee staan alle vijf oorspronkelijke punten op "gedaan of bewaakt". Ik laat het issue open voor die eerste bullet.

Poort: make check groen, gedraaid ná de rebase op main met #719 erin.

Derde hap op main: \`4fa0cd23\` (PR #720) — de commentaartaalpoort. Dat was volgens je eigen tussenstand het enige van de vijf punten waar nog helemaal niets voor stond. **De vraag was eerst óf dit te bewaken valt.** CONTRIBUTING schrijft er zelf bij dat een taalheuristiek die er 5% naast zit slechter is dan geen poort. Dat oordeel klopt — voor *classificeren*: dan moet élk blok een antwoord krijgen en telt elke twijfel mee. Mengdetectie is een andere vraag. Die zwijgt tenzij er van béide talen hard bewijs is, dus twijfel levert stilte op in plaats van een vals alarm. Dat is de reden dat dít wél kan en de taalkeuze niet, en het staat als zodanig in de poort en in CHECKS.md. **Wat de meting opleverde.** 47 ruwe treffers, allemaal met de hand nagekeken: - **37 zijn dartdoc met een Engelse samenvattingsregel boven een Nederlandse redenering.** Dat is precies de vorm die CONTRIBUTING elders vóórschrijft voor publieke types in `lib/models` en `lib/services` — de laag die `dart doc`, pub.dev en de IDE tonen. Een poort die de bijdragersgids beboet, wordt uitgezet. Dartdoc valt er dus buiten, en dat is geen gemakzucht maar de enige uitkomst die met de rest van de gids klopt. - **De 10 gewone commentaarblokken zijn allemaal echt.** Van een Engelse alinea met een Nederlandse eronder tot één zin die in het Engels begint en in het Nederlands afloopt (`shell_actions.dart:81`). **Die tien werk ik niet weg**, en dat is met opzet: dezelfde gids verbiedt commentaar herschrijven alléén om de taal te wijzigen — duizenden regels ruis met andermans redenering onder mijn naam in `git blame`. Ze staan als ratchet en zakken vanzelf zodra iemand er om een andere reden aankomt. **De poort is in beide richtingen getoetst**, want groen zegt niets als de regel niet afgaat. Met een geplante overtreding valt hij, en na terugdraaien is hij weer groen. Dat was geen formaliteit: mijn eerste versie ging er níét van af. Een hoofdletterfilter — bedoeld om typenamen als `Widget` te weren — gooide juist het sterkste signaal weg, namelijk "The …" aan het begin van een zin. Zonder die toets was dat gat blijven zitten en had de poort er groen bijgestaan zonder iets te meten. Die valkuil noemde je zelf in je vorige reactie over de semgrep-regels. **Bijvangst: een echte fout.** De dartdoc van `parseDer` zat vastgeplakt bovenop die van `_maxDerDepth` — de constante droeg een samenvatting die niet over haar ging, de functie had er helemaal geen. De poort viel erover als "een blok dat halverwege van taal wisselt", en dat wás het ook; de oorzaak zat alleen een laag dieper dan een taalkeuze. Geregistreerd waar het hoort: Makefile (eigen doel, in `check`), `docs/CHECKS.md` (rij plus de hele afweging), `check_ratchet_trend.dart` zodat `make ratchets` hem meeneemt, en CONTRIBUTING. De aantekening daar die zei dat er nog geen poort was, is niet weggehaald maar aangevuld: dat oordeel gold de dartdoc-clausule en geldt daar nog steeds — het is precies de reden dat de poort die overslaat. **Wat er van dit issue overblijft:** - `_queueGitSave` en `_poolPendingDeck` uit de state-laag. Ik heb ze in deze ronde bewust laten staan: dat zijn verplaatsingen mét gedrag, en die horen hun eigen PR met eigen tests te krijgen. - `app_shell` blijft groot, maar wordt door het per-klasse-plafond bewaakt en groeit dus niet ongemerkt. Dat is geen schuld die oploopt. Daarmee staan alle vijf oorspronkelijke punten op "gedaan of bewaakt". Ik laat het issue open voor die eerste bullet. Poort: `make check` groen, gedraaid ná de rebase op main met #719 erin.
Author
Owner

Vierde hap op main: `f2c75d09` (PR #725) — _queueGitSave en _poolPendingDeck uit de state-laag. Daarmee is de lijst uit je openingsbericht rond.

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

Eén bestand, en dat is ordening op contract en niet op grootte. 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; 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. Dat is dezelfde grens die je zelf bij saveToGit trok.

De winst zit in de tests, niet in de 41 regels. TabsNotifier gaat van 2251 naar 2210 en de ratchet zakt mee, maar dat is het kleinste deel. Beide functies waren alleen te bereiken via een opslagronde van de notifier; nu staan er zes directe tests op drie dingen die stil misgaan:

  • de werkkopie houdt de mem:-verwijzing ongepoold — de afspraak tussen de twee helften;
  • de lagen naast deck.md overleven het poolen, want 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 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. Twee richtingen van hetzelfde onderwerp horen bij elkaar, en de servicelaag kon de state-versie niet bereiken.

Stand van de vijf oorspronkelijke punten:

Punt Stand
Git-orkestratie uit de state-laag Af. Werkbranch, guard-basis, samenvoegen, werkkopie, en nu de wachtrij
Per-klasse-plafond Bestond al (maxClassLines + classSizeBaseline)
SOURCE_MAP-claim Versmald én afgedwongen (source_map_coverage_test.dart)
Commentaartaalregel Poort sinds 4fa0cd23 (PR #720)
app_shell Groot, maar bewaakt door het klasseplafond — geen schuld die oploopt

Ik sluit dit issue. Wat er nog aan app_shell te doen valt is geen structurele schuld meer maar gewoon een groot bestand met een plafond eromheen; komt daar ooit een concrete opsplitsing, dan is een nieuw issue eerlijker dan dit er open voor houden.

Poort: make check groen op main zelf, ná de rebase op #723.

Vierde hap op main: \`f2c75d09\` (PR #725) — `_queueGitSave` en `_poolPendingDeck` uit de state-laag. Daarmee is de lijst uit je openingsbericht rond. **Ze waren geen toestandswerk.** Er komt geen tabblad aan te pas, geen Riverpod en geen huidige selectie — alleen een werkkopie, een outbox en een forge. Ze staan nu als `queueDeckSave` en `poolPendingDeck` in `services/git/offline_queue.dart`. **Eén bestand, en dat is ordening op contract en niet op grootte.** 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; 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. Dat is dezelfde grens die je zelf bij `saveToGit` trok. **De winst zit in de tests, niet in de 41 regels.** `TabsNotifier` gaat van 2251 naar 2210 en de ratchet zakt mee, maar dat is het kleinste deel. Beide functies waren alleen te bereiken via een opslagronde van de notifier; nu staan er zes directe tests op drie dingen die stil misgaan: - de werkkopie houdt de `mem:`-verwijzing ongepoold — de afspraak tussen de twee helften; - de lagen naast `deck.md` overleven het poolen, want 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 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. Twee richtingen van hetzelfde onderwerp horen bij elkaar, en de servicelaag kon de state-versie niet bereiken. **Stand van de vijf oorspronkelijke punten:** | Punt | Stand | |---|---| | Git-orkestratie uit de state-laag | Af. Werkbranch, guard-basis, samenvoegen, werkkopie, en nu de wachtrij | | Per-klasse-plafond | Bestond al (`maxClassLines` + `classSizeBaseline`) | | SOURCE_MAP-claim | Versmald én afgedwongen (`source_map_coverage_test.dart`) | | Commentaartaalregel | Poort sinds `4fa0cd23` (PR #720) | | `app_shell` | Groot, maar bewaakt door het klasseplafond — geen schuld die oploopt | Ik sluit dit issue. Wat er nog aan `app_shell` te doen valt is geen structurele schuld meer maar gewoon een groot bestand met een plafond eromheen; komt daar ooit een concrete opsplitsing, dan is een nieuw issue eerlijker dan dit er open voor houden. Poort: `make check` groen op main zelf, ná de rebase op #723.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#518
No description provided.