[Feature] Structural debt: layering, class size, SOURCE_MAP #518
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#518
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Structural debt from the release review. None of it blocks a release; all of it decides how expensive the next year is.
layerRulesincheck_conventions.dart, hard zero) — but git orchestration still lives in the state layer: saving, merge-on-conflict, the queue and asset pooling sit instate/tabs_provider_git.dartrather thanservices/git/.TabsNotifieris ~2,800 lines across sevenpartfiles andDeckNotifier~1,400; thepartsplit quieted the gate while the class kept growing. Consider a per-class ceiling.app_shellis ~7,300 lines across 18 files, with git dialogs and storage orchestration sharing private scope.SOURCE_MAP.mdclaims a line perlib/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.CONTRIBUTING.mdhas 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.
Eerste hap op main:
89df3e39(PR #674) — de werkbranch-keuze (D3) uitTabsNotifiernaarlib/services/git/work_branch.dart, met acht tests op een functie die er nul had.TabsNotifierzakt van 2395 naar 2325; de basislijn zakt mee.Daarvóór, als bijvangst van #541: het hele native merge-oplosblok naar
resolveRepoDeckMergein de servicelaag, en het opbouwen van de werkkopie naarmirrorDeckFiles. 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:
maxClassLines+classSizeBaselineincheck_conventions.dart), dus "de ratchet telt bestanden, niet klassen" klopt niet meer;source_map_coverage_test.dart, vier regels);Wat open blijft:
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_shellblijft groot. Het per-klasse-plafond bewaakt het inmiddels wel, dus dit is geen schuld die groeit.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.
Tweede hap op main:
1ce550a2(PR #679) —roundBaseShaenmergeIntoRemoteuit de state-laag.TabsNotifierstaat nu op 2254 regels, tegen 2395 bij het begin van vandaag.saveToGitblijft staan, en dat is geen schuld. Die leest het huidige tabblad, zet de herkomst en roeptrefreshTabs()— 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 noemtsaveToGitals misplaatst; dat klopt niet meer, en dat is een correctie op het issue en niet op de code.Wat werkelijk overblijft:
_queueGitSaveen_poolPendingDeck— kleiner dan ze klonken;mirrorDeckFileshaalde het hart er al uit.app_shellblijft groot, maar wordt door het per-klasse-plafond bewaakt en groeit dus niet ongemerkt.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-secretsenmake sastdraaiden 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.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 intool/met een basislijn, plus de registratie in de Makefile endocs/CHECKS.md._queueGitSave/_poolPendingDecklaat ik in deze ronde staan; dat zijn verplaatsingen mét gedrag en die horen hun eigen PR te krijgen.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:
lib/modelsenlib/services— de laag diedart 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.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
Widgette 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
parseDerzat 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.dartzodatmake ratchetshem 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:
_queueGitSaveen_poolPendingDeckuit 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_shellblijft 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 checkgroen, gedraaid ná de rebase op main met #719 erin.Vierde hap op main: `
f2c75d09` (PR #725) —_queueGitSaveen_poolPendingDeckuit 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
queueDeckSaveenpoolPendingDeckinservices/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
_queueGitSaveblijft bestaan als dun laagje eromheen in plaats van te verdwijnen. Dat is dezelfde grens die je zelf bijsaveToGittrok.De winst zit in de tests, niet in de 41 regels.
TabsNotifiergaat 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:mem:-verwijzing ongepoold — de afspraak tussen de twee helften;deck.mdoverleven het poolen, want zonder dat verliest wachtend werk zijn notities net op het moment dat het landt;DraftStoreUnsupportedis geenGitForgeException, dus zonder de vangst liep hij ongevangen door.Onderweg verhuisde
repoAssetBytesmee naarrepo_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:
maxClassLines+classSizeBaseline)source_map_coverage_test.dart)4fa0cd23(PR #720)app_shellIk sluit dit issue. Wat er nog aan
app_shellte 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 checkgroen op main zelf, ná de rebase op #723.