Vervolginspectie 31-10: afsluiten, tweede start, focus en klikken #2687

Merged
brenno merged 16 commits from fix/vervolginspectie-3110 into main 2026-10-31 13:26:43 +00:00
Owner

Samenvatting

De vervolginspectie van 31-10 (#2686) repareert acht punten die na #2637 zijn blijven liggen.

  • Cmd+Q, Dock-stop en uitloggen op macOS lopen langs dezelfde sluitbewaking als de rode knop (#2678).
  • Een tweede start verdwijnt niet meer stil: Windows vraagt opnieuw of annuleren, Linux activeert het bestaande venster of gaat verder als de eerste niet antwoordt (#2679).
  • Een eigen toetsaanslag in een samenwerksessie schrijft het deck niet terug en laat een nieuwere gasttekst staan (#2680).
  • Schrijftips wachten dezelfde adempauze als de validatie, en de zinnen lopen via de vertaling (#2681).
  • Een geïmporteerde SVG wordt één keer opgeschoond en blijft in beeld bij een diawissel (#2682).
  • De presentatorklok herbouwt de dia niet elke seconde en trekt de focus niet terug uit Sluiten (#2683).
  • Een klik op een overzichtskaart of in de beeldkiezer selecteert meteen; het vinkvak en de sleepgreep laten een blokselectie intact (#2684).
  • De callout-controle leest de beeldkop niet opnieuw bij elke toetsaanslag, en de sync-IO-poort ziet lib/services/slide_quality/ (#2685).

Closes #2678
Closes #2679
Closes #2680
Closes #2681
Closes #2682
Closes #2683
Closes #2684
Closes #2685
Closes #2686

Bewaker

De bewakerstap is gedaan. Het bestandsformaat blijft Markdown; er is geen afhankelijkheid bijgekomen en er gaat geen nieuw verkeer de deur uit. De botsing zit in de publieke belofte van één venster en van werk dat niet stil verdwijnt:

  • Op macOS toont afsluiten dezelfde vraag over niet-opgeslagen werk als het sluiten van het venster. Wie de toestemmingspoort niet heeft geaccepteerd, kan nog steeds weg.
  • Op Windows toont een tweede start Opnieuw proberen of Annuleren. Annuleren start geen tweede exemplaar.
  • Op Linux schrijft een niet-antwoordende eerste instantie een logregel en gaat de tweede als eigen venster verder, zodat de gebruiker een venster ziet.

Die keuze laat "één venster, werk gaat niet stil verloren" voorgaan op "altijd meteen een nieuw proces". Van gedachten veranderen zou ik als een tweede exemplaar naast een levende eerste de herstelbestanden of het sessielock alsnog zou beschadigen.

Wat een test hier niet dekt

  • De Windows-MessageBox staat in windows/runner/main.cpp en komt niet onder flutter test. De Dart-toets dekt het Linux-protocol: een lege start activeert, en een primaire die niet antwoordt geeft binnen de time-out false.
  • De widgettoets die drie tekens typt en hetzelfde focusknooppunt vasthoudt (#2680) is niet geschreven. De eenheidstoetsen dekken wel dat de host bij een eigen aanslag writeDeck niet aanroept, en dat de gast abc houdt als de echo van a later binnenkomt.
  • De saneertijden van SVG's van 100 KiB, 1 MiB en 10 MiB (#2682) zijn niet gemeten. De toetsen dekken één opschoning per bestand en een diawissel zonder leeg vlak.
  • Cmd+Q is in de widgettoets nagespeeld via handleRequestAppExit, niet met de hand in de draaiende app.
  • De beeldkop (#2685) zit in een cache op pad, mtime en grootte. resolveContainedRealPath loopt nog bij elke analyse. De toets eist één koplezing bij een tweede analyse die alleen de bullets verandert.

Scans

make check is groen op deze machine. make check-secrets (gitleaks en trufflehog, --no-verification aan) vond niets. make sast (lokale Semgrep-regels, geen --config auto) vond niets. ZAP en Docker staan niet op deze machine, dus DAST is niet gedraaid.

Testplan

  • make check
  • make check-secrets
  • make sast
  • static-gate op de PR
## Samenvatting De vervolginspectie van 31-10 (#2686) repareert acht punten die na #2637 zijn blijven liggen. - Cmd+Q, Dock-stop en uitloggen op macOS lopen langs dezelfde sluitbewaking als de rode knop (#2678). - Een tweede start verdwijnt niet meer stil: Windows vraagt opnieuw of annuleren, Linux activeert het bestaande venster of gaat verder als de eerste niet antwoordt (#2679). - Een eigen toetsaanslag in een samenwerksessie schrijft het deck niet terug en laat een nieuwere gasttekst staan (#2680). - Schrijftips wachten dezelfde adempauze als de validatie, en de zinnen lopen via de vertaling (#2681). - Een geïmporteerde SVG wordt één keer opgeschoond en blijft in beeld bij een diawissel (#2682). - De presentatorklok herbouwt de dia niet elke seconde en trekt de focus niet terug uit *Sluiten* (#2683). - Een klik op een overzichtskaart of in de beeldkiezer selecteert meteen; het vinkvak en de sleepgreep laten een blokselectie intact (#2684). - De callout-controle leest de beeldkop niet opnieuw bij elke toetsaanslag, en de sync-IO-poort ziet `lib/services/slide_quality/` (#2685). Closes #2678 Closes #2679 Closes #2680 Closes #2681 Closes #2682 Closes #2683 Closes #2684 Closes #2685 Closes #2686 ## Bewaker De bewakerstap is gedaan. Het bestandsformaat blijft Markdown; er is geen afhankelijkheid bijgekomen en er gaat geen nieuw verkeer de deur uit. De botsing zit in de publieke belofte van één venster en van werk dat niet stil verdwijnt: - Op macOS toont afsluiten dezelfde vraag over niet-opgeslagen werk als het sluiten van het venster. Wie de toestemmingspoort niet heeft geaccepteerd, kan nog steeds weg. - Op Windows toont een tweede start *Opnieuw proberen* of *Annuleren*. Annuleren start geen tweede exemplaar. - Op Linux schrijft een niet-antwoordende eerste instantie een logregel en gaat de tweede als eigen venster verder, zodat de gebruiker een venster ziet. Die keuze laat "één venster, werk gaat niet stil verloren" voorgaan op "altijd meteen een nieuw proces". Van gedachten veranderen zou ik als een tweede exemplaar naast een levende eerste de herstelbestanden of het sessielock alsnog zou beschadigen. ## Wat een test hier niet dekt - De Windows-`MessageBox` staat in `windows/runner/main.cpp` en komt niet onder `flutter test`. De Dart-toets dekt het Linux-protocol: een lege start activeert, en een primaire die niet antwoordt geeft binnen de time-out `false`. - De widgettoets die drie tekens typt en hetzelfde focusknooppunt vasthoudt (#2680) is niet geschreven. De eenheidstoetsen dekken wel dat de host bij een eigen aanslag `writeDeck` niet aanroept, en dat de gast `abc` houdt als de echo van `a` later binnenkomt. - De saneertijden van SVG's van 100 KiB, 1 MiB en 10 MiB (#2682) zijn niet gemeten. De toetsen dekken één opschoning per bestand en een diawissel zonder leeg vlak. - Cmd+Q is in de widgettoets nagespeeld via `handleRequestAppExit`, niet met de hand in de draaiende app. - De beeldkop (#2685) zit in een cache op pad, mtime en grootte. `resolveContainedRealPath` loopt nog bij elke analyse. De toets eist één koplezing bij een tweede analyse die alleen de bullets verandert. ## Scans `make check` is groen op deze machine. `make check-secrets` (gitleaks en trufflehog, `--no-verification` aan) vond niets. `make sast` (lokale Semgrep-regels, geen `--config auto`) vond niets. ZAP en Docker staan niet op deze machine, dus DAST is niet gedraaid. ## Testplan - [x] `make check` - [x] `make check-secrets` - [x] `make sast` - [ ] `static-gate` op de PR
Cmd+Q, Dock-Stop en uitloggen gingen via NSApplication.terminate en sloegen de vraag over niet-opgeslagen werk over. De shell weigert die terminate tot de gebruiker kiest, en quitApp rondt daarna af.

Co-authored-by: Cursor <cursoragent@cursor.com>
Op Windows wacht een tweede starter op het primaire venster en geeft het op met een vraag in plaats van zonder venster te stoppen. Op Linux bevestigt de primaire elk bericht, ook een lege start, zodat een hangend exemplaar niet als geslaagde overdracht telt.

Co-authored-by: Cursor <cursoragent@cursor.com>
De bronkaart miste het nieuwe bestand, en de platform-override bleef staan tot na de invariantcontrole van de testbinding.

Co-authored-by: Cursor <cursoragent@cursor.com>
Een echo die niets verandert schreef het deck terug en verhoogde de revisie, waardoor het veld zijn focus verloor. Een oudere echo zet een nieuwere lokale tekst niet meer terug.

Co-authored-by: Cursor <cursoragent@cursor.com>
Een gast die een oudere echo negeert moet een latere wijziging van de host nog steeds binnenkrijgen.

Co-authored-by: Cursor <cursoragent@cursor.com>
Elke toetsaanslag scande het hele deck. De teller volgt nu de debounce, en de meldingen lopen via de vertaling.

Co-authored-by: Cursor <cursoragent@cursor.com>
Elke montage liep de allow-list opnieuw op de UI-draad en toonde intussen een leeg vlak. Een treffer op pad of bytes tekent meteen; een groot bestand gaat naar een achtergrond-isolate.

Co-authored-by: Cursor <cursoragent@cursor.com>
Elke mount las en saneerde het bestand opnieuw en toonde intussen een leeg vlak. Het gesaneerde resultaat blijft nu bewaard, en een treffer tekent meteen.

Co-authored-by: Cursor <cursoragent@cursor.com>
De secondewijzer zat op de hele presentator en trok de focus terug naar het notitieveld, zodat Tab naar Sluiten niet bleef staan.

Co-authored-by: Cursor <cursoragent@cursor.com>
De dubbelklik-herkenner hield de eerste klik 300 ms vast. Het indrukken selecteert meteen; de dubbelklik opent nog steeds.

Co-authored-by: Cursor <cursoragent@cursor.com>
Een kwaliteitsronde die alleen de bullets verandert opent hetzelfde
calloutbeeld opnieuw. De kop blijft gecachet op pad, stempel en grootte,
en typeSync valt voortaan ook onder de sync-IO-poort.

Co-authored-by: Cursor <cursoragent@cursor.com>
De gebruiker merkt het afsluiten, de tweede start, het samenwerken en de klik in het overzicht. Dat hoort in het wijzigingenlogboek voordat het landt.

Co-authored-by: Cursor <cursoragent@cursor.com>
De afsluittoets gokte een adempauze binnen runAsync, en de toelichting
bij een revisie-ophoging duwde DeckNotifier over het klassenplafond.

Co-authored-by: Cursor <cursoragent@cursor.com>
De focusbewaking hoort bij het paneel, niet in de opbouw ervan. Die
opbouw zat twee regels over het plafond.

Co-authored-by: Cursor <cursoragent@cursor.com>
De sectie heet al lib/widgets/shell/, dus een extra shell/ ervoor wees naar een map die niet bestaat en de dekkingstoets viel om.

Co-authored-by: Cursor <cursoragent@cursor.com>
Een pointer-down op de hele kaart selecteerde die ene dia vóór het vinkvak of de sleep aan de beurt was, zodat een meervoudige selectie uit elkaar viel.

Co-authored-by: Cursor <cursoragent@cursor.com>
brenno merged commit a6b4dc0661 into main 2026-10-31 13:26:43 +00:00
Sign in to join this conversation.
No description provided.