Skip to content

Rapport: restpunten uit de reviews op #138 (curvetoestand, kolommen laten vallen, weekendcijfers, getalnotatie, artifacts-beleid) - #139

Merged
Nozzit merged 3 commits into
mainfrom
claude/newest-issue-5kqmzu
Sep 14, 2026
Merged

Nozzit merged 3 commits into
mainfrom
claude/newest-issue-5kqmzu

Conversation

@Nozzit

@Nozzit Nozzit commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator

What and why

Refs #113, vervolg op #138. De twee hyperkritische reviewrondes op #138 lieten zes punten als "follow-up" liggen; op verzoek van de maintainer hier alle zes in één PR (commit 1), plus twee reviewrondes op déze PR zelf (commit 2 en 3).

  • Gedeelde curvetoestand. src/engine/contour/curveState.ts (assignmentCurveState, contouredAssignmentIds) is nu de ene weergaveregel voor "contour / geïmporteerde curve / vorm" die het eigenschappenpaneel (TaskAssignmentsSection) én het resourcediagram (computeResourceGanttRows) gebruiken — rapport en paneel kunnen niet meer uit elkaar drijven. Het verschil met de verdeelregel van ResourceLoad.ts's assignmentDayUnits (die verdeelt met curveValues óók naast een curve) staat daar één keer gedocumenteerd; die verdeelregel is bewust niet veranderd. Lege curveValues gelden niet als geïmporteerde curve.
  • Kolommen laten vallen. Laat de tabel mét toewijzingskolommen minder tijdlijn per papierbreedte over dan een vijfde van de printbreedte (vloer 160 logische px), dan laat renderReport de twee kolommen weg en meldt dat via RenderReportResult.assignmentColumnsDropped; het paneel toont de melding in het overzichtsblok (resourceGantt.columnsDropped, 14 locales). De regel is monotoon in de tabelbreedte (een bredere tabel laat altijd óók vallen; weglaten maakt de tijdas nooit smaller), A4 staand met verse instellingen houdt de kolommen, en de melding noemt alleen wat aantoonbaar ruimte geeft (papier/richting, lettergrootte, smallere tabel) zonder te beloven dat de kolommen terugkomen. Raster- en vector-export delen dezelfde beslissing, want dezelfde render.
  • Weekendcijfers. Een tijdvenster zonder werkdag dat op de kalender-as terugvalt nummert nu ook de weekenddagen (showWeekendDayNumbers in drawTimelineHeader); anders stond er geen enkel dagcijfer.
  • Eén getalnotatie. src/utils/reportNumber.ts (formatReportNumber, formatSignedReportNumber, localizeDecimalPoint): hoogstens twee decimalen, geen duizendtalscheiding, decimaalteken van de app-taal, altijd Latijnse cijfers (-u-nu-latn; fa koos anders Perzische cijfers naast Latijnse tellingen), "0" in plaats van "-0", plus én min uit dezelfde Intl-aanroep (signDisplay: 'exceptZero'), formatters per taal gecachet. De bidi-markering U+200E die Intl in ar/fa vóór een teken zet blijft bewust staan (zonder staat "-2" in een RTL-alinea als "2-"); dat Inter er in de vector-PDF een tofu van maakte is opgelost waar het hoort: bidiShape.stripBidiControls laat de stuurtekens pas weg bij het shapen van elke run (ná de levelberekening) en op het Latijnse/CJK-snelpad vóór het encoden. Gebruikt door de tabelrapporten (dd.num/dd.signed/dd.lagText), de Eenh./d- én Duur-cel van de Gantt-afdruk (PrintOptions.numberLocale; niet-eindige duur ⇒ "—"), fmtDelta in het variance-rapport (DOM en PDF) en de lag in het waarschuwingenpaneel. Zonder taal de neutrale punt. Let op: dit verandert de tabelrapporten van toFixed(1) naar hoogstens twee decimalen ("2.35" i.p.v. "2.3"), geeft in nl/de/fr een komma, en rondt de Duur-cel van de Gantt-afdruk op twee decimalen af; hele duren blijven byte-identiek.
  • Artifacts-beleid. CLAUDE.md + .gitignore: artifacts/<onderwerp>/ = klein gecommit schermbewijs bij een PR (PNG, ≤ ~150 KB, een handvol per PR, na de merge niet bijwerken); geldt vooruit, artifacts/tabel-overhaul/ dateert van daarvóór; qa/ = lokaal.
  • Middernacht-gedrag. Gids nl+en (periodesectie): een preset zonder statusdatum bepaalt "vandaag" bij elke weergave opnieuw, op de UTC-kalender (in Nederland kantelt de dag om 01:00/02:00). Pre-existing gedrag uit Rapport: gedeelde rapportageperiode (#120) en gegroepeerde belasting per week/maand (#119) #134, nu benoemd.

Bewust gelaten: de PID-hergebruikzwakte in de browser-testguard (scripts/dev-lock.mjs) — buiten dit onderwerp; het UTC-"vandaag" zelf (formatDate(new Date()), een app-breed patroon) — gedocumenteerd, niet veranderd; en de ASCII-lag in bewerkbare gridcellen (parseLagInput leest die terug).

How it was verified

  • npm run verify green — lokaal, los per commit: typecheck, lint, verify:docs (34 × 14), verify:i18n, cycles, store-boundaries, de volledige planningssuite (exit 0, tijdzone-matrix incl.), en de browserspecs resource-gantt-report, table-reports, report-options, contour-dialog (6/6).
  • Twee hyperkritische reviewrondes op deze PR. Ronde 1 (op commit 1): twaalf bevindingen — de vaste 240 px gooide op A4 staand de kolommen al bij verse instellingen weg, de getalnotatie was binnen één tabel inconsistent en gaf in fa een gemengd cijfersysteem, de gidsen beschreven drempel en middernacht fout. Ronde 2 (op commit 2): zeven bevindingen — het strippen van de bidi-markering keerde het minteken om in ar/fa (DOM én PDF), de "alleen als weglaten helpt"-regel liet een dode zone met een tijdas van 1 px zonder melding, de melding noemde hefbomen die in 22 van 31 gevallen niets oplosten of naar een onzichtbare slider wezen, formatters werden per cel gebouwd. Alle negentien opgepakt in commit 2 en 3.
  • Regressie: tests/planning/check-print-report.ts (kolommen weggelaten bij 500 én 800 px naamkolom op A4 liggend, bij naamkolom 350 en bij 125 % op A4 staand, niet op A4 staand met verse instellingen; weekendvenster toont dagcijfers 10 en 11; numberLocale: 'nl' ⇒ "1,5" en "2,5d"; niet-eindige duur ⇒ "—"), tests/planning/check-reports.ts (curvetoestand incl. lege curveValues; getalnotatie nl/en/de/fa/ar, bidi-markering blijft, -0, NaN, misvormde én onbekende taalcode, lag-tekst; layoutRuns met nepfonts: geen stuurteken bereikt het shapen, "-2" blijft één LTR-run met de min vooraan), tests/browser/resource-gantt-report.spec.ts (de melding verschijnt op A4 staand 125 % en verdwijnt op 100 %).
  • Niet end-to-end nagemeten: een écht geëxporteerde Arabische vector-PDF met een negatief getal (er is geen browserspec die dat doet); de keten is bewezen op het niveau van bidi-js-levels, run-segmentatie en glyph-emissie.

Does this touch

  • Project data — n.v.t.
  • Scheduling logic — n.v.t. (de verdeelregel assignmentDayUnits is niet aangeraakt).
  • User-visible textresourceGantt.columnsDropped in alle 14 report.json-locales; getallen in de rapporten volgen nu de app-taal.
  • @tauri-apps/* — n.v.t.

Documentation

  • public/docs/{nl,en}/gids-rapporten-printen.md (periodesectie: UTC-middernacht; resourcediagram: wanneer de kolommen wegvallen en wat ruimte geeft), CLAUDE.md (artifacts-beleid), .gitignore-commentaar.
  • docs/CHANGELOG.md bewust niet (alleen bij een release).

🤖 Generated with Claude Code

https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq

…kolommen laten vallen, weekendcijfers, getalnotatie, artifacts-beleid, middernacht-doc

Alle zes vervolgpunten die na PR #138 waren blijven liggen, in één keer:

- Eén weergaveregel voor de curvetoestand van een toewijzing
  (`src/engine/contour/curveState.ts`: `assignmentCurveState`,
  `contouredAssignmentIds`) die het eigenschappenpaneel én het resourcediagram
  delen; het verschil met de verdeelregel van `assignmentDayUnits` staat daar
  gedocumenteerd in plaats van op twee plekken herhaald.
- De toewijzingskolommen vallen automatisch weg zodra de tabel minder dan
  `MIN_CHART_WIDTH_PX` (240 px) tijdlijn per papierbreedte overlaat (lange
  taaknamen met afkappen uit); `RenderReportResult.assignmentColumnsDropped`,
  melding in het overzichtsblok, sleutel in 14 locales.
- Een tijdvenster zonder werkdag dat op de kalender-as terugvalt nummert nu ook
  de weekenddagen (anders stond er geen enkel dagcijfer).
- Eén getalnotatie voor alle rapporten (`src/utils/reportNumber.ts`): hoogstens
  twee decimalen, geen duizendtalscheiding, decimaalteken van de app-taal —
  tabelrapporten via `dd.num`/`dd.signed`, de eenhedenkolom via
  `PrintOptions.numberLocale`; zonder taal de neutrale punt (tests ongewijzigd).
- Artifacts-beleid vastgelegd: `artifacts/<onderwerp>/` = klein gecommit
  schermbewijs bij een PR, `qa/` = lokaal (CLAUDE.md, .gitignore).
- Gids nl+en: presets zonder statusdatum schuiven na middernacht een dag op;
  de kolommen kunnen wegvallen bij een brede naamkolom.

Regressie: check-print-report (weglaten bij 800 px naamkolom op A4 liggend,
niet bij de gewone; weekendcijfers 10/11 op een weekendvenster; "1,5" bij
numberLocale nl), check-reports (curvetoestand-helper, contourkoppeling,
getalnotatie nl/en/de/plus). Browserspecs resourcediagram, tabelrapporten,
contourdialoog en rapportopties groen.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
… het helpt, één getalnotatie in alle rapporten, docs en melding waarheidsgetrouw

Hyperkritische review op de restpunten-PR (twaalf bevindingen, alle opgepakt):

- Toewijzingskolommen laten vallen (bevindingen 1, 2, 4): de grens is niet
  langer een vaste 240 px maar een vijfde van de printbreedte met een vloer van
  160 px, en de render laat de kolommen alléén weg als de tabel zónder die
  kolommen wél past. A4 staand met verse instellingen houdt de kolommen dus;
  een naamkolom van 800 px op A4 liggend houdt ze óók (weglaten loste daar
  niets op: 8 px tijdlijn). De melding en beide gidsen noemen nu de echte
  hefbomen (papier/richting, lettergrootte, naamkolom, Voltooiing tonen)
  in plaats van "kap de namen af" — dat stond al aan (bevinding 3).
- Getalnotatie (bevindingen 5–7): `formatReportNumber` dwingt Latijnse cijfers
  af (`-u-nu-latn`, fa koos anders arabext naast Latijnse tellingen), stript
  de bidi-markering U+200E die Inter in de vector-PDF als spatie zette, geeft
  "0" in plaats van "-0", en de plus komt uit `signDisplay: 'exceptZero'`
  in plaats van een ASCII-plus naast een typografische min. De Duur-cel van
  de Gantt-afdruk, `fmtDelta` in het variance-rapport (DOM én PDF) en de
  lag-tekst in het gezondheidsrapport (`localizeDecimalPoint`) volgen nu
  dezelfde notatie als de Eenh./d-cel en de tabelrapporten.
- Middernacht-doc (bevinding 8): "vandaag" volgt de UTC-kalender en wordt
  bij elke weergave bepaald, niet "bij elke herberekening".
- Artifacts-beleid (bevinding 9): benoemt dat `artifacts/tabel-overhaul/`
  van vóór de regel dateert.
- Melding (bevindingen 10, 11): browserassertie op de melding (verschijnt op
  A4 staand 125 %, verdwijnt op 100 %); de vlag wordt gewist zodra er geen
  Gantt-render meer is.
- `curveState` (bevinding 12): lege `curveValues` zijn geen geïmporteerde curve.

Regressie: check-print-report (drop/geen drop/staand/lettergrootte, duurcel),
check-reports (fa/ar/-0/NaN/onbekende taal/lag-tekst/lege curveValues),
resource-gantt-report.spec.ts.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
…p monotoon, melding zonder loze hefbomen, formatters gecachet

Zeven bevindingen van de tweede hyperkritische review, alle opgepakt:

- Bidi (bevinding 1, hoog): de U+200E die Intl in ar/fa vóór een teken zet
  wordt niet meer gestript — zonder staat "-2" in een RTL-alinea als "2-"
  (DOM én de bidi-js-levels van de vector-PDF). De tofu die Inter ervan
  maakte is een emissieprobleem en zit nu dáár: `bidiShape.stripBidiControls`
  haalt de stuurtekens (LRM/RLM/ALM/embeddings/isolaten) pas weg bij het
  shapen van elke run, ná de levelberekening; het Latijnse/CJK-snelpad en
  `measureText` strippen vóór het encoden; beide coverage-checks slaan ze
  over. De test die de strip eiste is omgekeerd, plus een headless
  `layoutRuns`-test met nepfonts.
- Kolomdrop (bevinding 3): weer monotoon in de tabelbreedte — de tussen-
  variant "alleen als weglaten helpt" liet een dode zone open (A4 staand,
  naamkolom 350: tabel past de pagina niet, kolommen bleven, tijdas 1 px,
  geen melding) en een bredere naamkolom bracht de kolommen terug.
  Regressiecase op precies die zone; de 800-px-case laat nu wél vallen.
- Melding + gidsen (bevinding 2): geen "zet Voltooiing tonen uit" en geen
  verwijzing naar de naamkolomslider (die in de automodus niet bestaat);
  alleen wat aantoonbaar ruimte geeft, zonder te beloven dat de kolommen
  terugkomen. 14 locales.
- Formatters gecachet per taal (bevinding 4: ~35 µs → ~0,7 µs per cel),
  ook het decimaalteken voor `localizeDecimalPoint`.
- Duurcel: niet-eindig ⇒ "—" in plaats van een losse "d" (bevinding 5).
- WarningsPanel toont de lag met hetzelfde decimaalteken als het
  gezondheidsrapport (bevinding 6); bewerkbare cellen blijven ASCII.
- `formatSignedReportNumber` past dezelfde "-0"-vangnet toe en een
  welgevormde maar onbekende taalcode valt expliciet terug (bevinding 7).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
@Nozzit
Nozzit merged commit 9d8cdec into main Sep 14, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants