perf(layout): doorlopende lijstnummers lineair per deck (#1050) #1076

Merged
brenno merged 1 commit from feat/linear-list-numbering-1050 into main 2026-08-01 14:02:14 +00:00
Owner

Wat & waarom

numberedListStartFor liep recursief de hele doorlopende genummerde keten terug en werd per slide opnieuw aangeroepen door de rail, presentatiemodus en export. Voor een lange keten is dat O(n²); voor 5000 doorlopend genummerde slides ~12,5 miljoen eerdere-slidebezoeken en recursiediepte 4999 (stack-overflowrisico). Closes #1050.

Aanpak

  • Nieuw numberedListStarts(slides): berekent álle startnummers in één lineaire pass — elke slide leunt alleen op het al berekende startnummer van zijn voorganger, dus geen recursie en geen per-slide ketenwandeling.
  • Multi-slide-oppervlakken (slide_rasterizer, slide_list_panel) roepen die ene pass aan en indexeren erin.
  • numberedListStartFor blijft voor de single-slide-oppervlakken (preview, presenter, audience) maar delegeert nu naar de pass — recursievrij.

Toetsing

  • Schaaltest over een keten van 5000 bewijst lineair gedrag en dat de diepste slide zonder recursie oplost.
  • Test die onderbrekingen/herstarts van de nummering bewaakt.
  • Test die numberedListStarts tegen numberedListStartFor gelijklegt voor elke slide.
  • CHANGELOG bijgewerkt (### Changed / Prestaties).

🤖 Generated with Claude Code

## Wat & waarom `numberedListStartFor` liep recursief de hele doorlopende genummerde keten terug en werd per slide opnieuw aangeroepen door de rail, presentatiemodus en export. Voor een lange keten is dat O(n²); voor 5000 doorlopend genummerde slides ~12,5 miljoen eerdere-slidebezoeken en recursiediepte 4999 (stack-overflowrisico). Closes #1050. ## Aanpak - Nieuw `numberedListStarts(slides)`: berekent álle startnummers in één lineaire pass — elke slide leunt alleen op het al berekende startnummer van zijn voorganger, dus geen recursie en geen per-slide ketenwandeling. - Multi-slide-oppervlakken (`slide_rasterizer`, `slide_list_panel`) roepen die ene pass aan en indexeren erin. - `numberedListStartFor` blijft voor de single-slide-oppervlakken (preview, presenter, audience) maar delegeert nu naar de pass — recursievrij. ## Toetsing - Schaaltest over een keten van 5000 bewijst lineair gedrag en dat de diepste slide zonder recursie oplost. - Test die onderbrekingen/herstarts van de nummering bewaakt. - Test die `numberedListStarts` tegen `numberedListStartFor` gelijklegt voor elke slide. - CHANGELOG bijgewerkt (### Changed / Prestaties). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
perf(layout): bereken doorlopende lijstnummers lineair per deck (#1050)
Some checks failed
scans / scans (pull_request) Has been cancelled
c127a616ae
numberedListStartFor liep recursief de hele doorlopende keten terug en werd
per slide opnieuw aangeroepen door de rail, presentatiemodus en export — voor
een lange keten O(n^2) met stack-overflowrisico (5000 slides = recursiediepte
4999).

Nieuw: numberedListStarts(slides) berekent alle startnummers in één lineaire
pass (elke slide leunt alleen op het al berekende startnummer van zijn
voorganger). De multi-slide-oppervlakken (rasterizer, slide-lijstpaneel) roepen
die ene pass aan en indexeren erin. numberedListStartFor blijft voor de
single-slide-oppervlakken, maar delegeert nu naar de pass en is dus recursievrij.

Schaaltest bewijst lineair gedrag over een keten van 5000 en bewaakt
onderbrekingen/herstarts van de nummering.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno force-pushed feat/linear-list-numbering-1050 from c127a616ae
Some checks failed
scans / scans (pull_request) Has been cancelled
to e77e213efb
All checks were successful
scans / scans (pull_request) Successful in 3m33s
2026-08-01 13:40:12 +00:00
Compare
brenno force-pushed feat/linear-list-numbering-1050 from e77e213efb
All checks were successful
scans / scans (pull_request) Successful in 3m33s
to c3296a0244
Some checks failed
scans / scans (pull_request) Has been cancelled
2026-08-01 13:47:17 +00:00
Compare
brenno force-pushed feat/linear-list-numbering-1050 from c3296a0244
Some checks failed
scans / scans (pull_request) Has been cancelled
to c9dbcea51a
All checks were successful
scans / scans (pull_request) Successful in 3m34s
2026-08-01 13:49:15 +00:00
Compare
brenno force-pushed feat/linear-list-numbering-1050 from c9dbcea51a
All checks were successful
scans / scans (pull_request) Successful in 3m34s
to bc803f6605
Some checks failed
scans / scans (pull_request) Has been cancelled
2026-08-01 13:57:13 +00:00
Compare
brenno force-pushed feat/linear-list-numbering-1050 from bc803f6605
Some checks failed
scans / scans (pull_request) Has been cancelled
to e20c1f2abb
All checks were successful
scans / scans (pull_request) Successful in 3m33s
2026-08-01 13:57:34 +00:00
Compare
brenno merged commit 1343670699 into main 2026-08-01 14:02:14 +00:00
brenno deleted branch feat/linear-list-numbering-1050 2026-08-01 14:02:14 +00:00
Sign in to join this conversation.
No description provided.