-
Notifications
You must be signed in to change notification settings - Fork 0
Changelog
Nozzit edited this page Jul 24, 2026
·
2 revisions
Note: detailed change notes are currently maintained in Dutch. English release summaries are on the Releases page.
Alle noemenswaardige wijzigingen aan Open Planner Studio worden hier vastgelegd.
Nieuwe wijzigingen komen bovenaan onder Ongepubliceerd; houd ze gegroepeerd
per type (Toegevoegd, Gewijzigd, Opgelost, Documentatie).
-
OFL-1.1-licentietekst gevendord bij het meegeleverde Inter (
src/services/pdf/fonts/Inter-OFL.txt- toelichting in
src/services/pdf/fonts/README.md) — de Open Font License verplicht dat de licentietekst met het font meegeleverd wordt; die verplichting ontbrak nog sinds Inter in fase 0/1 van de vector-PDF-export (issue #23) als raw TTF gevendord werd.
- toelichting in
- De gids Rapporten & printen (
gids-rapporten-printen, nl+en) is bijgewerkt voor de vectorexport: uitleg dat het PDF-bestand nu scherp blijft op elk zoomniveau en selecteerbare/ doorzoekbare tekst bevat, plus de CJK/RTL-raster-fallback.
- De kalenderwaarschuwing bij "Project verplaatsen…" bevatte een lege mededeling. De waarschuwing vuurt bij twee onafhankelijke symptomen — het projecteinde verspringt met een ánder aantal kalenderdagen dan gekozen, en/of de projectduur in werkdagen verandert — maar noemde er altijd béíde. Trad er maar één op, dan stond er iets zinloos: "de projectduur gaat van 177 naar 177 werkdagen", of andersom "het einde verschuift 11 kalenderdagen in plaats van 11". Beide gevallen komen in de praktijk voor; in een planning zonder feestdagen in het verschoven venster is "alleen het einde verspringt" zelfs het gewone geval. Nu drie varianten met een eigen tekst.
-
"Project verplaatsen…" toonde meervoud bij één item. De waarschuwingsregels schreven
"1 taken hebben een harde Mandatory-pin" en "1 externe koppelingen"; de detailregel maakte er
"1 deadlines" van. De vijf telsleutels gebruiken nu i18next-pluralisatie in alle veertien talen.
Daarbij bleek een addertje: ontbreekt één plural-categorie in een taal, dan valt i18next niet
terug op de
_othervan diezelfde taal maar opfallbackLng— een Poolse gebruiker met twéé items kreeg dan Engelse tekst te zien. Elke taal heeft daarom precies de categorieën die CLDR voorschrijft (Pools vier, Arabisch zes), bewaakt door de nieuwe batterijcheck-i18n-plurals. De detailregel is omgebouwd van één zin met vijf tellingen naar "label: aantal", waarin het label niet met het getal congrueert; nul-categorieën vallen nu weg in plaats van "0 deadlines" te tonen. -
Lag ging verloren in de backward-uurberekening bij een mijlpaal-voorganger. In de
eind-startrelatie deden de grensvlaggen
predEndsBeginOfDay/succIsFinishMsdubbel werk: ze onderdrukten naast de finish-normalisatie óók de lag, terwijl de dagberekening de lag altijd toepast en de vlaggen alleen over de dagstap laat beslissen. Gevolg was een verkeerde totale speling en een verkeerd kritiek pad in uurplanning — dezelfde planning gaftf=1en niet-kritiek in uurmodus tegentf=0en kritiek in dagmodus. Voorwaartse en achterwaartse berekening spraken elkaar dus tegen. Vijf nieuwe cases incases-hours-relations.jsonleggen het vast, inclusief een negatieve lag (lead) en dagpariteits-ankers. -
Dag/uur-asymmetrie bij een startmijlpaal-voorganger. De uurtak trok het dagbegin-anker van een
startmijlpaal via
prevWorkInstantterug naar het vorige bandeinde, terwijl zo'n mijlpaal geen echte finish-instant heeft en de dagtak het doeldatumlabel juist behoudt. Werk-equivalent, maar de mijlpaal toonde in uurmodus een late finish op de vórige werkdag. De dagkant was nergens gedekt — bestaande mijlpaalcases asserteerden wel vroege maar geen late datums — en heeft nu een pariteitsanker. -
Voltooide taken in het grote voorbeeldproject leken uit te lopen. De generator schreef
werkelijke datums uit handgeschreven werkdag-indices waarin
finishDay − startDay == dur, terwijl de index-vertaling inclusief telt; bovendien sloeg die vertaling alleen weekenden over en geen feestdagen, waardoor een taak op Goede Vrijdag begon. Elke voltooide taak kreeg daardoor een dag schijn-uitloop, die in de achterwaartse berekening terugstapelde totTF=-4op de startmijlpaal. Werkelijke datums komen nu uit de doorgerekende, kalenderbewuste planning en de statusdatum wordt afgeleid uit het geplande einde van de kraanopbouw in plaats van uit een vaste dag-index. Het voorbeeld heeft nu nul taken met negatieve speling. Twee cases incases-progress.jsonleggen het onderliggende solvergedrag vast (voltooid conform plan ⇒ speling 0; uitloop ⇒ negatieve speling). - Het eigenschappenpaneel toonde een andere startdatum dan de Gantt-balk. Vier oppervlakken (balk, tooltip, tabel, taakdialoog) tonen de berekende datum; het paneel toonde als enige de rauwe ankerdatum. Gemeten over alle 24 voorbeelden liep dat op tot 484 dagen verschil, en in het grote voorbeeld week 246 van de 249 taken af — het paneel toonde voor bijna elke taak simpelweg de projectstartdatum. Het veld toont nu de berekende datum en schrijft alleen bij een echte wijziging naar het anker, met een verklarende hint in alle 14 talen.
-
Loze undo-stappen bij verwijderacties.
removeSequence,deleteTask,removeResource,removeCalendarendeleteBaselinepushten een undo-snapshot vóór hun filter, zodat een aanroep met een onbekend id een lege stap achterliet.
- Het print-/exportfont voor rapporten is gewijzigd van de systeem-font-stack naar het meegeleverde Inter. Dit hoort bij de vectorexport hierboven: de oude preview/export mat tekstbreedtes met welk font het besturingssysteem toevallig als eerste in de stack aanbood, wat per platform (en soms per machine) verschilde. Nu is dat altijd Inter, dus is de layout deterministisch over Windows/macOS/Linux/browser. Neveneffect: bestaande exports kunnen bij herexport licht anders uitvallen — een iets andere tekstbreedte kan een regel doen afkappen of doorlopen, wat weer het aantal pagina's kan verschuiven. Functioneel identiek, visueel niet per se pixel-gelijk aan een export van vóór deze wijziging.
- Projectgegevens zijn nu ongedaan te maken. Naam, omschrijving, auteur, bedrijf, start- en einddatum, statusdatum, voortgangsmodus, rekenopties en de projectkalender-keuze vielen tot nu toe volledig buiten undo. Ze zitten nu in de momentopname en elke wijziging is een undo-stap, met een gelijkheidscontrole ervoor zodat opslaan-zonder-wijziging geen lege stap oplevert. Dit repareerde meteen twee bestaande halve-herstel-bugs: undo na het verwijderen van een kalender of het opslaan van de kalenderbibliotheek zette de bibliotheek wél terug maar de projectkalender niet, waarna de interne cache op de verkeerde kalender bleef staan. Een ingetypte statusdatum kost voortaan één undo-stap in plaats van drie (het datumveld commit bij elke toetsaanslag).
- Het grote voorbeeldproject heeft een tweede bouwstroom gekregen. Het toonde meerdere kritieke paden alleen dankzij de hierboven beschreven datafout; met correcte data was er één pad over. Fase 7 is uitgebouwd tot een echte parallelle stroom: zodra het parkeerdek gestort is begint een eigen ploeg aan de garage-afbouw, die via het buitenterrein zonder speling naar dezelfde opleverdatum loopt als de torens. Bijvangst: de tijdelijke bouwweg werd voorheen opgebroken terwijl de torens nog omhoog moesten — die volgorde klopt nu.
-
De IFC-writer schrijft de afgeleide analyse-eigenschappen niet meer. De pset
OPS_Analysis(interfererende speling, bijna-kritiek, float-pad-nummer) bevatte uitsluitend uitvoer van de planningsberekening zonder gebruikersinvoer; alle 589 taken in de voorbeelden reproduceerden hun opgeslagen waarden bit-exact na herberekening. Dat scheelt ongeveer 157 kB in de meegeleverde voorbeelden — de web-selectie ging van 726 naar 567 kB — en ruwweg een vijfde van elke automatische tussenopslag, die per open document elke 800 ms draait. Bestaande bestanden mét deze eigenschappen laden ongewijzigd; crashherstel rekent voortaan door, net als elk ander laadpad.
-
PDF-rapportexport is nu vectorgrafisch met selecteerbare tekst (issue #23). De export van het
Gantt-rapport, het mijlpalen-overzicht en het variance-rapport bedde het gerenderde voorbeeld
voorheen als één raster-afbeelding in het PDF-bestand — scherpte hing af van de canvas-resolutie
en er viel niets te selecteren of doorzoeken. De export tekent nu rechtstreeks als PDF-vectoren
(lijnen, vlakken en ingebedde, gesubsette tekst) via
pdf-lib, zodat het resultaat op elk zoomniveau scherp blijft en tekst selecteerbaar/doorzoekbaar is — precies zoals van een "echt" PDF verwacht. Dit geldt voor Latijnse, Cyrillische en Griekse tekst (ingebed met het meegeleverde Inter-font, zie hieronder); documenten met CJK-tekst (Chinees/Japans/Koreaans) of RTL-tekst (Arabisch/Perzisch) herkent de export automatisch en die vallen terug op de oude raster-export — nog steeds correct leesbaar, maar niet selecteerbaar. Vector-CJK komt later via een extensie; vector-RTL volgt in een latere fase. -
Geavanceerde CPM (fase 2.9) — de kritieke-pad-motor is compleet gemaakt ten opzichte van
Primavera P6 en MS Project, in zowel dag- als uurplanning (ontwerp:
docs/superpowers/specs/2026-07-06-geavanceerde-cpm-design.md):- Alle constraint-types in de berekening. Naast de bestaande "zachte" constraints nu ook logica-brekende Mandatory Start/Finish-pins: een vastgepinde taak wordt onvoorwaardelijk op zijn datum gezet — ook als een voorganger daardoor niet op tijd klaar is — en de resulterende negatieve speling wordt stroomopwaarts (naar de voorgangers) gedreven in plaats van door de pin heen. Een secundaire constraint per taak (P6's primair + secundair), met live validatie die onmogelijke combinaties weigert. Constraints werken nu uur-precies: een datum-met-tijd wordt tot de minuut gehonoreerd op een uurkalender, een datum-zonder-tijd blijft dagverankerd.
- Hammock-taken (Level of Effort). Een hammock leidt zijn duur af uit de afstand tussen zijn start-driver en finish-driver en rekt automatisch mee wanneer die dragers verschuiven; hij telt nooit mee in het kritieke pad en legt geen speling-druk op zijn dragers.
- Externe (cross-project) koppelingen. Verwijs naar een taak in een ander bestand via een bevroren ankerdatum (P6 External Dates), voor alle vier relatietypes en beide richtingen. De externe taak toont als ghost-balk; ankers zijn per koppeling én projectbreed te verversen, en een niet-geladen bron krijgt een "verouderd"-markering. Geen live twee-documenten-herberekening.
- Near-critical-analyse. Een instelbare drempel markeert taken met weinig speling (amber-band tussen kritiek en normaal; in het hoog-contrastthema met een blokpatroon). Default uit; aangezet is de drempel 2 werkdagen en de weergave volgt de duureenheid (dagen of uren, fractioneel).
-
Meerdere kritieke paden / float paths. Parallelle ketens worden genummerd (
floatPathper taak) via driving-logic-peeling of totale-float-rangschikking, met een instelbaar maximum. - Interfering float — de speling die een taak wél kan opnemen zonder het projecteinde te raken maar die tussenliggende taken verschuift (totale float − vrije float), getekend en fractioneel.
- Berekening-instellingenblok op het project. Een nieuwe projectsectie voor de rekenkeuzes: lag-kalenderkeuze, kritiek-definitie (float-drempel of langste pad), float-berekeningswijze, open-einde-taken-kritiek, near-critical-drempel en float-paths. Op het project (niet app-breed), zodat hetzelfde bestand overal dezelfde planning geeft.
- Interop. Taak-constraints round-trippen nu óók in P6-XML en MSPDI (voorheen gingen die bij export verloren), inclusief de hard/secundair-uitbreiding; hammocks, externe koppelingen en het Berekening-blok bewaren hun gegevens via custom IFC-property-sets.
- Volledig backwards-compatible: elke nieuwe optie heeft als default exact het bestaande gedrag; documenten van vóór 2.9 rekenen en serialiseren byte-voor-byte identiek.
-
Urenplanning (fase 2.8b) — scheduling wordt uur-/minuut-bewust, bovenop de dag-granulaire
kern van 2.8a (ontwerp:
docs/superpowers/specs/2026-07-06-uren-scheduling-design.md):- Hoofdschakelaar Urenplanning (Instellingen, default uit): schakelt de uur-/ minuten-scheduling in — een uur-tijdschaal, ploegen met werktijd-banden en uur-precieze taakbalken. Uit ⇒ de app blijft byte-voor-byte hetzelfde dag-granulaire gedrag van vóór 2.8b. Aparte instelling "Gemengde dag/uur-planning toestaan" voor documenten die beide soorten taken/kalenders combineren.
- Werktijd-banden per weekdag op de kalender: meerdere banden per dag (pauzes), banden die over middernacht heen lopen (nachtploeg) en een volledige 24/7-vorm. Kant-en-klare ploegen-presets (dagdienst, 2 ploegen, 3 ploegen, nachtploeg, 24/7) plus een banden-editor (band toevoegen, bewaren als eigen preset, per weekdag instellen, kopiëren naar alle werkdagen) met een live afgeleide uren/dag-indicator.
-
Uur-tijdschaal in de Gantt: de al aanwezige uur-/kwartier-tiers (
timelineTiers, tot dusver dood sinds fase 2.7) worden geactiveerd zodra een kalender uur-data heeft. - Drie duurweergave-modi in de instellingen: automatisch (eigen eenheid per taak), altijd dagen, altijd uren — met een waarschuwing bij gemengde kalenders in de taaktabel en drie aparte duur-invoervakjes (dagen/uren/totaal uren) in het taakdialoog.
- Taakbalk-opsplitsing bij onderbrekingen: instelbaar nooit/bij selectie/altijd, zodat een taak die over een pauze of nachtblok heen loopt visueel als losse segmenten getoond kan worden in plaats van als één doorlopende balk.
- Minuut-precieze interop: P6-XML, MSPDI en IFC lezen en schrijven nu sub-dag-duur en -tijden verliesloos (voorheen werd alles afgerond op hele dagen); documenten zonder uur-data round-trippen ongewijzigd.
- Datumvelden herbouwd: typbare dag/maand/jaar-segmenten in plaats van een enkel tekstveld, met een projectbrede datumnotatie-instelling en bijbehorende kalenderdialoog-fixes.
- Volledig vertaald in alle 14 talen.
- Bewuste beperkingen: een instelbare lag-kalender-optie (P6's "Calendar for scheduling Relationship Lag") is fase 2.9; sub-dag resource-nivellering (per-uur/per-shift capaciteits-emmers) blijft dag-emmer-gebaseerd; tijdzone/DST-bewuste scheduling en per-rij Gantt-arcering op afwijkende taak-kalenders volgen later.
-
Kalender-uitbreidingen (fase 2.8a) — de kalender wordt een eersteklas, meervoudig,
jaar-onafhankelijk concept (ontwerp:
docs/superpowers/specs/2026-07-04-kalenders-design.md):-
Jaar-onafhankelijke feestdagen-engine (
src/engine/calendar/holidays.ts): regelgebaseerd i.p.v. een hardgecodeerde 2026-lijst, met een Pasen-algoritme en substitutieregels (bv. Koningsdag op zondag → 26 april, VK-feestdagen die in het weekend vallen → eerstvolgende maandag). Zeven landensets: NL, Duitsland incl. alle 16 Bundesländer, België, Frankrijk (+ Alsace-Moselle), Verenigd Koninkrijk (EN-WLS/SCT/NIR), Oostenrijk en Zwitserland. Bevrijdingsdag (5 mei) volgt de lustrum-regel: alleen in jaren deelbaar door 5 wordt hij als feestdag gegenereerd (overige jaren optioneel te kiezen). - Bouwvak is nu opt-in via de wizardkeuze (geen/Noord/Midden/Zuid), met default geen — de oude standaardkalender bakte stilzwijgend drie weken bouwvak (regio Noord) in elk nieuw project, wat in de fase-2.5-QA een 5-daagse taak liet ogen als een "opgerekte balk van vier weken". De regionale bouwvak-datums komen uit een geverifieerde datatabel per jaar met een benaderings-fallback voor jaren buiten de tabel.
-
Kalender-bibliotheek: de resource-kalenderregistry (fase 2.5) is gepromoveerd tot dé
projectbrede bibliotheek (
calendars: WorkCalendar[]) waar project, taken én resources allemaal naar verwijzen — één centrale plek i.p.v. een impliciete projectkalender plus een losse resource-registry. Bestaande documenten migreren automatisch (inline projectkalender wordt bibliotheek-entry "Projectkalender"). -
Taak-specifieke kalenders in de CPM: elke taak kan een eigen kalender krijgen
(
Task.calendarId, fallback projectkalender); de solver rekent duur, float en constraint-snaps per taak in diens eigen kalender via een engine-cache. Voorganger- kalender-lagregel: de lag tussen twee taken telt in de kalender van de voorganger (P6-default), terwijl de opvolger-afgeleide starttijd in de kalender van de opvolger snapt — forward en backward pass spiegelen deze verdeling exact, zodat float symmetrisch blijft. -
Wizard (
ProjectInfoDialog): land/regio-dropdown (Bundesland bij Duitsland, landsdeel bij VK, kanton bij Zwitserland), de bouwvak-keuze, een vaste-winterstop-checkbox (default uit) en een compacte feestdagen-preview met uitklapbare lijst — vervangt de oude, jaargebonden 3-presets-dropdown. - Kalenderdialoog als bibliotheekbeheer: lijst van alle bibliotheekkalenders met actief/projectdefault-markering, nieuw/dupliceren/verwijderen, en een nieuwe "Feestdagen genereren…"-knop die dezelfde land/regio/bouwvak-generator als de wizard opent — ook voor bestaande projecten, niet alleen bij het aanmaken.
- Gantt-naamlabel op meerdaagse feestdagblokken: blokken breder dan een paar zoom-pixels tonen nu hun naam (bv. "Bouwvak (Noord)") in de arceringszone, zodat direct zichtbaar is wélke feestdag of vakantieperiode in de planning zit.
-
IFC-reader-gat gedicht: werkweek en werkuren lezen nu ook daadwerkelijk terug uit
IFCRECURRENCEPATTERN/IFCTIMEPERIOD(voorheen viel een 6- of 7-daagse kalender bij het herladen stilzwijgend terug op de ma-vr-default). Meerdere benoemde kalenders en de taak-kalender-koppeling round-trippen viaIfcRelAssignsToControlen een nieuwe OPS-pset (regelset-id/bouwvak-keuze). -
Multi-kalender- en taak-kalender-round-trip ook in MSPDI (
Calendars+Task CalendarUID, effectief gemaakt) en P6-XML (StandardWorkWeek/HolidayOrExceptions,CalendarObjectIdper activity). Verliesmatrix in het ontwerpdoc §8.4. - Volledig vertaald in alle 14 talen; de test-suite groeide van 280 naar 289 handberekende
cases, alle bestaande cases ongewijzigd groen,
verify:examplesbyte-identiek. - Bewuste beperkingen: uren-/minuten-based scheduling en dag/nacht-ploegenkalenders zijn fase 2.8b (het datamodel blijft dag-granulair — een uur-kalender heeft nu geen effect op de solver); per-rij Gantt-arcering op afwijkende taak-kalenders volgt later (de globale kolom-arcering blijft op de projectkalender, MSP-gedrag); een instelbare lag-kalender-optie (P6's "Calendar for scheduling Relationship Lag") is fase 2.9 — 2.8a legt voorganger-kalender vast als interne constante; weer-/vorstafhankelijk winterverlet is fase 4 (2.8a kent alleen een vaste, jaarlijks terugkerende winterstop-periode); de bouwvak-tabeldatums zijn adviesdata (Bouwend Nederland) die met een benaderingsfallback verder in de toekomst minder precies worden.
-
Jaar-onafhankelijke feestdagen-engine (
-
Weergaven (fase 2.7) — echte, opslaanbare weergaven op de Beeld-ribbontab (ontwerp:
docs/superpowers/specs/2026-07-04-weergaven-design.md):- Tijdschaal-reparatie: de tot dusver dode tijdschaal-keuze is vervangen door een werkende dropdown (Jaar/Kwartaal/Maand/Week/Dag) die naar zoom-presets mapt; het getoonde label wordt afgeleid uit de daadwerkelijke zoomstand (kan dus nooit meer desyncen van de getekende as) en de viewport recentert op het middelpunt van het huidige venster bij het wisselen van schaal.
-
Eén gedeelde zichtbare-rijenlijst (
computeViewRows) voor tabel én Gantt: filter, groepering en sortering worden voortaan op precies één plek berekend, zodat tabel en Gantt-canvas structureel niet meer uit elkaar kunnen lopen (structurele pariteit). - Kolom-configuratie in de taaktabel: zichtbaarheid, volgorde en breedte per kolom, over builtin-velden, activity codes, custom fields en een nieuwe resource-kolom (comma-gescheiden join via toewijzingen, read-only in 2.7).
- Geneste AND/OR-filters met een P6-achtige editor (All/Any-groepen, veldtype-bewuste waarde-invoer: tekst/getal/datum/dropdown voor codes/resources), inclusief "show summaries"-gedrag (niet-matchende ouders van een match blijven zichtbaar, gedimd).
- Groeperen tot 2 niveaus over elk veld (WBS, activity code, custom field, resource, taaktype) met bandkop + count, en onbeperkt multi-key-sorteren (stabiele sort, respecteert de WBS-hiërarchie binnen boommodus).
- Structuur-vergrendeling buiten boommodus: indent/outdent en taak-verslepen zijn uitgeschakeld zodra filter/groep/sort actief is (structuur-mutaties zijn alleen welgedefinieerd in de pure boommodus); waarde-mutaties (cel-edits, toevoegen, verwijderen) blijven altijd mogelijk.
- Custom layouts: opslaan/toepassen/hernoemen/verwijderen/beheren, app-globaal (localStorage, niet per document), met stille tolerantie voor velden die in het huidige document niet (meer) bestaan.
- Presentation mode (F11) via de echte Fullscreen-API: alle chrome (titelbalk, lint, documenttabs, statusbalk, eigenschappenpaneel) verdwijnt, alleen de Gantt full-bleed blijft over; Escape of de browser/OS-fullscreen sluit af.
- Split view binnen één document: twee onafhankelijke tijdvensters naast elkaar op dezelfde gedeelde rijen en verticale scroll — bijvoorbeeld een detailweek naast een ver weg liggende mijlpaal.
- Mini-map: een lichte thumbnail-strook van de hele planning met een sleepbaar viewport-kader.
- Auto-bereken-instelling (drie surfaces: tandwiel ⚙, Settings-ribbon-tab en backstage) plus de "Bereken"-naamgeving geconsolideerd tot één i18n-sleutel overal (ribbon, menu, eigenschappenpaneel).
- Volledig vertaald in alle 14 talen; de test-suite groeide van 256 naar 280 handberekende cases, alle bestaande cases ongewijzigd groen.
- Bewuste beperkingen: uur-tijdschaal wacht op uren-/minuten-scheduling (fase 2.8) — het datamodel is dag-granulair, een uur-as zou nu misleiden; rollup-totalen per groepsband (som duur/kosten/units) volgen later (fase 3.5/3.9); een split view met twee verschillende documenten vergt een store-singleton-refactor en is bewust later; layouts zijn app-globaal en round-trippen niet mee in het IFC-bestand (per-bestand-layouts zijn bewust later).
-
Baselines & voortgang (fase 2.6) — statusdatum-gestuurde CPM, echte
voortgangsregistratie en onbeperkte baselines (ontwerp:
docs/superpowers/specs/2026-07-04-baselines-voortgang-design.md):- Statusdatum (P6 data date) op het project: stuurt de CPM-forward-pass — voltooide taken worden op hun actuals vastgeklonken, gestarte-niet-voltooide taken plaatsen hun resterende werk vanaf de statusdatum, en niet-gestarte taken kunnen niet vóór de statusdatum starten. Geen statusdatum gezet ⇒ het gedrag is byte-voor-byte gelijk aan vóór 2.6.
-
Echte voortgangsregistratie: percentage-voltooid, werkelijke start en
werkelijke einde (de tot dusver dode
TaskTime-velden) met afgedwongen invarianten (een werkelijk einde impliceert 100 %, 100 % impliceert een werkelijk einde, invullen van een percentage zet automatisch een werkelijke start, actuals mogen nooit ná de statusdatum liggen).remainingTimeis altijd afgeleid uit het percentage. - Retained Logic / Progress Override als projectbrede voortgangsmodus: bepaalt hoe het resterende werk van een taak die vóór zijn voorganger is afgerond zich verhoudt tot de netwerklogica.
- Out-of-sequence-detectie: taken die voortgang tonen terwijl hun voorganger- relatie (FS/SS/FF/SF) dat logisch tegenspreekt, worden gemarkeerd en gemeld als waarschuwing — blokkeert niets, volgt de gekozen voortgangsmodus.
- Onbeperkte, benoemde baselines (P6-stijl snapshots) met precies één actieve; beheer via een baseline-dialoog (opslaan/hernoemen/verwijderen/activeren) in de Planning-tab.
- In de Gantt: een statusdatumlijn, een baseline-overlay (dunne onderbalk per taak tegen de vastgelegde baselinedatums) en een voortgangslijn (MSP-zigzag die per rij naar de voortgangspositie uitstulpt) — alle drie los in-/uit te schakelen.
- Variance-rapport als derde rapporttype in het Rapport-paneel: baseline- vs. huidige start/einde per taak, delta in werkdagen, status (op schema/later/ eerder/nieuw/vervallen) en een projecteinde-samenvatting.
- Round-trip door IFC 4.3 (actuals in de al bestaande maar tot dusver
ongebruikte
IfcTaskTime-slots 14-18 — spec-conform; statusdatum/ voortgangsmodus inOPS_ProjectSettings; baselines dubbelspoor via een verlieslozeOPS_Baselines-JSON plus.BASELINE.-scheduleheaders voor interop), MSPDI (volwaardig: Baseline0,<StatusDate>, actuals), P6-XML (best-effort: actuals + data date; P6-baselines zijn een gedocumenteerd verlies) en CSV (nieuwe actual-start/-einde-kolommen, bewust zonder baselines/statusdatum). Gouden regel bewaard: bestanden zonder 2.6-data round-trippen bit-identiek. - Volledig vertaald in alle 14 talen; de CPM-regressiesuite groeide van 240 naar 256 handberekende cases, alle bestaande cases ongewijzigd groen.
- Bewuste beperkingen: geen kosten/werk/Earned Value (SPI/CPI/BCWP) — dat is fase 3.5; P6-baselines worden niet geëxporteerd (best-effort, gedocumenteerd verlies); het instellen van statusdatum/voortgangsmodus is niet undo-baar (zelfde precedent als de projectkalender — undo via leegmaken + herberekenen).
-
Voorbeeldprojecten in Backstage — een nieuwe sectie Bestand → Voorbeelden
ontsluit de meegeleverde voorbeeldplanningen (kaartjes met naam, omschrijving en
tags). Klikken opent het voorbeeld in een nieuw tabblad (geen bronbestand, dus
opslaan wordt opslaan-als). De lijst is data-gedreven via
public/examples/manifest.json, zodat nieuwe voorbeelden er zonder codewijziging in komen. Werkt in de web- én desktopbuild. De sectie toont nu twee groepen: de drie showcase-planningen bovenaan (badge "Alle functies"), daaronder de eenvoudige voorbeelden (manifest-veldcategory). -
Voorbeeld-generator herbouwd (
npm run gen:examples) — de voorbeelden worden nu volledig door de app zelf opgebouwd via de échte store +runCPM()+writeIFC(i.p.v. een met de hand nagebouwde IFC-writer, die was gedrift). Drift tussen de voorbeelden en de app is daarmee structureel onmogelijk. Nieuw:- Drie showcase-planningen (woningbouw / infra / renovatie) die samen álle app-functies benutten: alle vier relatietypes + lags/leads/%-lag/ELAPSEDTIME, datum-constraints + deadlines incl. een bewust conflict met negatieve float, start-/eind-/verplichte mijlpalen, activity codes + custom fields, alle vijf resourcetypes met ploeg-hiërarchie, resource-kalenders, availabilitySteps, alle zes toewijzingscurves, een met nivellering oplosbare overallocatie en een vastgepinde taak (prioriteit 1000).
- Jaar-onafhankelijke datums: projecten ankeren relatief ("eerste maandag van maart, volgend jaar"); NL-feestdagen (incl. Pasen-afgeleiden) en de bouwvak worden per jaar berekend, zodat regenereren altijd actuele datums oplevert.
- Twintig sectorvoorbeelden verrijkt met échte fase-overlap (SS/FF-relaties, leads en %-lags op de fasegrenzen) en gevarieerde kalenders, zodat er een realistisch kritiek pad mét float ontstaat (55–86 % kritiek i.p.v. bijna alles). De twee oude, met de hand gebouwde "grote" voorbeelden zijn vervangen door de showcases.
-
Verificatie (
npm run verify:examples): elk bestand gaat door de échtereadIFCmet asserts op tellingen, round-trip-stabiliteit en aanwezige functies.
-
Resources (fase 2.5) — resourcebeheer, belasting, overallocatie en
automatische nivellering (ontwerp:
docs/superpowers/specs/2026-07-03-resources-design.md):- Vijf resourcetypes: arbeid (mensen), materieel (kranen, machines, steigers), materiaal (beton, staal, hout), onderaannemer en ploeg. Ploegen bundelen andere resources; elke resource heeft een maximale capaciteit, eenheid en optioneel een eigen kalender.
- Tijd-gefaseerde capaciteit: de beschikbaarheid van een resource kan per periode wijzigen (availability-stappen) — bijv. drie timmerlieden tot week 10, daarna vijf.
- Resource-toewijzing aan taken met units per dag en zes verdeelcurves (gelijkmatig, front-loaded, back-loaded, klok/bell, en op- en aflopend), zodat de inzet realistisch over de taakduur wordt uitgesmeerd. Toewijzen kan alleen op werkbare (leaf-)taken.
- Belasting- en overallocatie-engine in de berekening (F5 / Berekenen): per resource wordt de dagelijkse belasting opgeteld en vergeleken met de capaciteit; overbelasting wordt gemarkeerd.
- Resource-histogram als strook onder de Gantt, met een gedeelde tijd-as, capaciteitslijn, rode pieken boven de lijn, een resourcekiezer met overallocatie-badges en drill-down-tooltip; de hoogte is instelbaar en persistent.
- Automatische resource-nivellering én smoothing: een serieel plaatsings- algoritme (SGS) verschuift taken binnen hun speling om overallocatie op te lossen, gesorteerd op prioriteit/speling/startdatum. Nivelleren gaat via een dialoog met vooraf-preview (verschuivingen, nieuwe einddatum, resterende conflicten) en is met één klik toe te passen of te annuleren.
- Taak-prioriteit (0–1000; 1000 = niet nivelleren) stuurt welke taken bij schaarste voorrang krijgen.
- Resources-ribbontab met beheerpaneel (resources + capaciteitsstappen + kalenderkoppeling), een toewijzingensectie in het taak-eigenschappenpaneel, de histogramstrook en de nivelleer-dialoog.
- Round-trip door IFC 4.3 (o.a.
IfcCrewResource,OPS_Resource/OPS_Assignments/OPS_Leveling-psets, eenIfcWorkCalendarper resource enIfcTask.Priority) en import/export via Primavera P6-XML en MS Project MSPDI — resources, toewijzingen, curves en resource-kalenders reizen mee. Gouden regel: bestanden zónder resources blijven bit-identiek. - Volledig vertaald in alle 14 talen; de CPM-regressiesuite groeide van 202 naar 231 handberekende cases (incl. nivelleer- en smoothing-scenario's), alle bestaande cases ongewijzigd groen.
-
Herstel-dialoog in de app zelf — bij het opstarten na een onverwachte
afsluiting verschijnt de herstelvraag nu als een eigen, gestylede React-dialog
(
RecoveryDialog) in plaats van een native OS-dialog. De dialoog toont per te herstellen document de projectnaam, het bestandspad (indien bekend), het aantal taken en het tijdstip van de laatste auto-save-snapshot. Escape stelt de keuze uit zonder de recovery-bestanden op te ruimen; de auto-save wordt uitgesteld tot de keuze gemaakt is, zodat de snapshots niet vroegtijdig worden overschreven. (Was desktop-only; sinds v2026.7.11 heeft de browser-build ook recovery, via IndexedDB.) - De standaard taak-prioriteit is nu een expliciete waarde (500) i.p.v. leeg, zodat prioriteit voorspelbaar meeweegt bij nivellering; een expliciet ingevulde 0 blijft behouden (werd voorheen in de MSPDI-export stil naar 500 gecorrigeerd).
-
Bestanden openen en opslaan in de browser. De web-versie was tot nu toe volledig bruikbaar
behalve bestand-I/O — die zat achter een desktop-check. Dat gat is dicht:
- Openen, opslaan, opslaan-als en exporteren (IFC, CSV, MS Project, Primavera P6) werken nu ook in de browser.
- Browsers met de File System Access API — in de praktijk de Chromium-familie (Chrome, Edge, Opera, Brave, Vivaldi, …): je opent een bestand, bewerkt het en slaat met Ctrl+S over hetzelfde bestand op, precies zoals op de desktop. De browser vraagt daarbij eenmalig schrijftoestemming.
- Browsers zonder die API — op dit moment Firefox en Safari: nette terugval, openen via een bestandskiezer en opslaan als download. In-place overschrijven kan daar niet; dat wordt ook niet voorgespiegeld.
- De app kijkt naar de mogelijkheid, niet naar de browsernaam (feature-detectie). Rolt een browser de API later alsnog uit, dan werkt in-place opslaan daar vanzelf — zonder nieuwe versie.
- Recente bestanden zijn opnieuw te openen in browsers met die API (de verwijzing naar het bestand wordt bewaard, niet alleen de naam). Ontbreekt de ondersteuning, dan wordt de lijst verborgen in plaats van niet-werkende items te tonen.
- Auto-save en crash-herstel werken nu ook in de browser: bij elke wijziging wordt (gedebounced) een momentopname per open document bewaard, en na een crash of per ongeluk sluiten biedt de app bij het opstarten aan om te herstellen. Sluit je het tabblad met niet-opgeslagen wijzigingen, dan waarschuwt de browser eerst.
- De desktop-versie verandert hierdoor niet: die gebruikt dezelfde gedeelde laag met het bestaande bestandssysteem-gedrag.
-
Bouwmodus-schakelaar — een bouw-agnostische modus voor gebruik buiten de bouwcontext
(ontwerp:
docs/superpowers/specs/2026-07-13-bouwmodus-toggle-design.md).
- Acht gaten waardoor gegevens bij opslaan verloren gingen, zijn gedicht. Het opslagcontract round-tript nu aantoonbaar volledig (met een nieuwe testbatterij die dit permanent afdwingt).
- Openen verloor activity-codes en custom fields. Alle open-paden lopen nu door één gedeelde laad-implementatie, zodat structuurgegevens niet meer stil wegvallen.
- De snelle opslaan-route in de browser liet velden vallen (activity-codes, custom fields, baselines, kalenderbibliotheek). Alle state→IFC-routes bouwen hun gegevens nu op één plek op.
- Speling verdween bij horizontaal scrollen. De speling-band werd samen met de taakbalk overgeslagen zodra die balk links buiten beeld schoof, ook als de band zelf nog ruim zichtbaar was.
- Gantt-slepen: het verslepen van de balkrand schrijft nu de juiste (inclusieve werkdagen-)duur, en elke duur is bereikbaar — ook de beginwaarde.
- Niet-werkdagen werden altijd als zaterdag/zondag gearceerd in plaats van volgens de projectkalender; ploegen- en afwijkende kalenders tonen nu correct.
- Crash bij het wisselen van document na een herstel-actie (een bevroren kalenderlijst werd gemuteerd). Permanent bewaakt met een regressietest.
- PDF-export herzien: meerdere pagina's, paginarichting en een voorbeeldweergave die overeenkomt met het resultaat.
- Beeld-tab en titelbalk overlapten bij een smal venster; de weergave-opties staan nu in een 2×2-raster.
- Instellingen: nettere indeling, uniforme checkboxes en werkende toetsbediening in dropdowns.
-
Beveiligingsupdate:
serde_with3.18.0 → 3.21.0 (GHSA-7gcf-g7xr-8hxj). - Ontwikkelomgeving: Vite bekeek bij een tweede dev-server alle git-worktrees mee (kon het systeemlimiet voor bestandsbewaking overschrijden), en negeerde omgekeerd juist álle bestanden wanneer je de dev-server ván binnen een worktree draaide — waardoor wijzigingen niet doorkwamen.
-
Grote saneringsronde op basis van een modulariteits-audit van de volledige codebase. Geen
functionele wijzigingen, wel structureel minder plekken waar dezelfde fout opnieuw kan ontstaan:
één canoniek documentcontract voor per-document-state (capture/herstel/undo), een transactiehelper
die een 50× herhaald patroon vervangt, één gedeeld laad-pad, een pset-registry die IFC-lezer en
-schrijver koppelt, een declaratieve ribbon- en instellingen-registry, gedeelde dialoog-primitives,
een stabiele extensie-facade met centrale permissietabel, één relatie-wiskunde-module, en
App.tsxteruggebracht van 741 naar 345 regels. - Testdekking uitgebreid met batterijen die de zojuist gedichte gaten permanent bewaken: IFC-round-trip, documentcontract en Gantt-speling-zichtbaarheid.
-
Mijlpalen (fase 2.4) — start-/eindmijlpalen, verplichte mijlpalen en een
mijlpalen-overzicht (ontwerp:
docs/superpowers/specs/2026-07-02-mijlpalen-design.md):-
Start- en eindmijlpalen (P6 Start/Finish Milestone) via een dag-granulair
grens-model: een startmijlpaal ankert op een dagbegin, een eindmijlpaal op een
dageinde (einde werkdag F = begin volgende werkdag). FS naar een eindmijlpaal landt
op de finishdag zelf; een FS/SS-opvolger van een eindmijlpaal start de werkdag erna.
undefined= automatisch (het anker volgt de bindende relatiezijde) — bestaande bestanden rekenen bit-gelijk. Gouden invariant: een tussengevoegde mijlpaal verschuift de keten nooit. -
Verplichte (contractuele) mijlpalen:
mandatory-vlag met dubbel-ruit in de Gantt; datumbewaking via de bestaande 2.3-constraints (FNLT/MFO → negatieve float). Ribbon-mijlpaalknop is een keuzemenu: startmijlpaal, eindmijlpaal of inspectiemoment (eindmijlpaal + taaktype Keuring/Inspectie + verplicht). - Mijlpalen-overzicht als tweede rapporttype in het Rapport-paneel: tabel met soort, datum, constraint-/deadline-datum, float, verplicht en status (op schema / kritiek / te laat, kleurgecodeerd), afdrukbaar; samenvatting met verplicht- en te-laat-tellers.
- Round-trip door IFC 4.3 (
OPS_Milestone-pset; automatisch schrijft niets) en P6-XML (activitytypeStart/Finish Milestone, soort blijft behouden bij import). - Testsuite gegroeid van 176 naar 202 handberekende cases (batterij
cases-milestone-kinds.json), alle bestaande cases ongewijzigd groen.
-
Start- en eindmijlpalen (P6 Start/Finish Milestone) via een dag-granulair
grens-model: een startmijlpaal ankert op een dagbegin, een eindmijlpaal op een
dageinde (einde werkdag F = begin volgende werkdag). FS naar een eindmijlpaal landt
op de finishdag zelf; een FS/SS-opvolger van een eindmijlpaal start de werkdag erna.
- Indent/outdent van taken (MSP-conventie): Alt+Shift+→/← en knoppen in Planning → Structuur; inspringen maakt een taak kind van zijn voorgaande sibling, uitspringen maakt hem sibling ná zijn ouder — subbomen liften mee, WBS-autonummering hernummert en het is één undo-stap.
- Resizebare takentabel in de Gantt: sleep de scheidingslijn (150–800 px, persistent); vervangt de vaste breedte van 350 px.
- Compacte ribbon-modus: een klein pijltje rechtsonder in het lint (Word-web-stijl) klapt het lint in naar één rij van 40 px in plaats van 94 px — voor kleine schermen; de stand wordt onthouden.
- Het mijlpaal-vinkje in het eigenschappen-paneel zet de duur nu op 0 en disabled het duurveld; de tabellen tonen consequent duur 0 voor mijlpalen (was: stille divergentie).
- Nieuwe mijlpalen krijgen niet langer standaard het taaktype Keuring/Inspectie (dat is nu voorbehouden aan het inspectiemoment).
-
In-app updater op .deb-installaties (Ubuntu/Debian): .deb-installs kregen alleen
handmatige update-instructies, op de verouderde aanname dat de Tauri-updater .deb niet
in-place kan vervangen. De updater-plugin (≥2.6; wij draaien 2.10.1) doet dat wél —
hij matcht de
linux-x86_64-deb-entry inlatest.jsonvia de bundle-type-stempel in het binary en installeert via pkexec/sudo +dpkg -i. De update-dialog toont op .deb nu de normale "Downloaden en installeren"-knop; het handmatige copy-paste-commando en de downloadpagina-knop blijven als fallback wanneer de installatie faalt. -
Windows-auto-update brak door draft-URL in
latest.json: de re-sign-stap inrelease.ymlnam de download-URL over uit de GitHub-API terwijl de release nog draft was, waardoor dewindows-x86_64(-nsis)-entries naar eenuntagged-…-URL wezen die na publicatie 404't (zo geschied in v2026.7.1). De workflow bouwt nu zelf de stabielereleases/latest/download/-URL uit de assetnaam; delatest.jsonvan release v2026.7.1 is ter plekke gerepareerd (alle URL's geverifieerd 200, signatures ongewijzigd). -
Scherp app-icoon op Linux: het runtime-venstericoon was 32×32 (eerste PNG in
bundle.icon), waardoor docks een opgeschaald wazig icoon toonden.icon.png(512 px) staat nu vooraan, 256×256/512×512 vullen de hicolor-slots in de.deb/snap en alle maten zijn opnieuw uit de 1024px-vectorbron gegenereerd (incl.snap/gui/icon.png).
-
Constraints & deadlines (fase 2.3) — datum-constraints, deadlines en negatieve float
(ontwerp:
docs/superpowers/specs/2026-07-02-constraints-deadlines-design.md):- Alle 8 datum-constraints in CPM (ASAP, ALAP, SNET, SNLT, FNET, FNLT, MSO, MFO) met P6-soft-semantiek: constraints breken nooit de netwerklogica — vroege-zijde types zijn ondergrenzen in de forward pass, late-zijde types bovengrenzen in de backward pass; MSO/MFO werken als P6's Start On/Finish On (beide grenzen tegelijk); ALAP schuift naar zero-free-float (P6-model, en de relatie wordt daarna correct driving). Constraint-datums snappen naar werkdagen. De logica-brekende Mandatory-pin is bewust §2.9.
- Deadline per taak (MSP-model, zacht): begrenst alleen de late finish — balken bewegen nooit; float wordt gemeten tot de deadline en negatief bij overschrijding.
-
Negatieve float: totale speling is nu getekend (min van start- en finish-float,
MSP-veilig) en
kritiek = float ≤ 0; gemiste deadlines en geschonden constraints propageren negatieve float door de voorgangerketen (DCMA-checks 5/7 als kader). - Indicatoren: constraint-pin op de balkrand (blauw = vroege-zijde, violet = late-zijde, rood = geschonden), deadline-pijl op de deadline-datum (groen/rood), P6-asterisk achter de datum in de tabel, negatieve float rood in de spelingkolom en warning-tellers in de statusbar.
- Round-trip via
OPS_Constraints-pset (IfcTaskTime heeft geen constraint-slots); testsuite 159 → 176 handberekende cases.
- Dependabot-alert #12 (glib
VariantStrIter, RUSTSEC-2024-0429) beoordeeld en gedismisst als not used: de API wordt door app noch Tauri's gtk3-pad gebruikt en de fix (glib 0.20) vereist GTK4-bindings die Tauri 2 niet gebruikt — herzien bij een Tauri-migratie.
-
WBS & structuur (fase 2.2) — de structuurlaag op professioneel niveau
(ontwerp:
docs/superpowers/specs/2026-07-02-wbs-structuur-design.md):- Automatische WBS-nummering (1.2.3.4 uit de boompositie): nieuwe projecten nummeren live bij elke structuurmutatie (aan/uit via Planning → Structuur); bestaande bestanden behouden hun vrije codes (MSP-model) met een expliciete Hernummer WBS-actie. Nieuwe taken krijgen ook zonder auto een afgeleide code, en plakken hernummert de geplakte tak (geen code-duplicaten meer).
- Activity codes (P6-model): projectgebonden codetypes (bv. Locatie, Discipline) met waarden (code + omschrijving + kleur), max één waarde per type per taak; beheer via de nieuwe dialoog Codes & velden, toewijzing in het eigenschappen-paneel en als tabelkolommen.
- Custom fields: getypeerde gebruikersvelden (tekst/getal/geheel getal/ kosten/datum/ja-nee) per taak, zichtbaar als tabelkolommen.
- Meerdere WBS-indelingen: Beeld → Groeperen op toont tabel én Gantt als banden per codewaarde (kleurstrook + label, P6 Group & Sort-stijl) — de vakstandaard voor locatie × discipline zonder tweede opgeslagen boom.
- WBS-templates (Asta task-pools-stijl): rechtsklik op een samenvattingstaak → Bewaar tak als sjabloon (taken + interne relaties incl. lag); invoegen en beheren via Planning → Structuur → Sjablonen. App-niveau (localStorage).
-
IFC 4.3-round-trip voor dit alles: definities als
IfcPropertySetTemplate(+IfcPropertyEnumerationvoor codetypes, gedeclareerd viaIfcRelDeclares), waarden per taak alsOPS_CustomFields/OPS_ActivityCodes-psets met getypeerde waarden, projectvlag inOPS_ProjectSettings; verliesloze meta-JSON voor eigen bestanden en template-terugval voor bestanden van derden. - Kopiëren/plakken van WBS-takken bestond al; de nieuwe velden liften mee en
plakken behoudt nu ook
lagUnit/lagPercentvan interne relaties (fix).
-
Volledige dependencies (fase 2.1) — het relatiemodel is op het niveau van professionele
planners gebracht (ontwerp:
docs/superpowers/specs/2026-07-02-volledige-dependencies-design.md):-
Lag-eenheid per relatie: werkdagen (default) of kalenderdagen (24/7, bv. uitharden
van beton) — IFC-conform als
IfcTaskDurationEnum(WORKTIME/ELAPSEDTIME); notatie2dvs.3edin editors, CSV en MSPDI (LagFormat 8). -
Procentuele lag (bv.
SS+50%, MS Project-semantiek): percentage van de duur van de voorganger, bij elke CPM-run opnieuw geëvalueerd; round-tript via IFC (IfcRatioMeasure) en MSPDI (LagFormat 19/20); P6-export bakt uit naar vaste uren (met logmelding). -
Negatieve lag (lead) afgerond: klem op de projectstart blijft (P6/MSP-conform) maar een
afgekapte lead wordt nu gemarkeerd, net als een lead groter dan de voorgangerduur;
leads serialiseren ISO-8601-conform (
-P2D) en de omgewisseldeIfcLagTime-attributen (LagValue ↔ DurationType) zijn rechtgezet — oude bestanden blijven leesbaar. - Driving/non-driving relaties (P6-definitie: relationship free float = 0, gelijkspel toegestaan): doorgetrokken vs. gestreepte pijlen in de Gantt (rood = kritieke driving-lijn), ⚡-indicator in het eigenschappen-paneel en de relatietabel.
- Relatietabel — nieuwe ribbon-tab Relaties: alle relaties in één sorteerbare, inline bewerkbare tabel (voorganger, type, lag, opvolger, driving, vrije speling per relatie, waarschuwingen) + "nieuwe relatie uit selectie"; de Beheer-knop op de Planning-tab opent hem.
- Path tracing (MSP Task Path-stijl): trace-knoppen (voorgangers/opvolgers) op de Planning- en Relaties-tab + contextmenu "Pad traceren" — transitieve voorgangers goud, opvolgers paars (driving-ketens donkerder), de rest gedimd; Escape stopt.
- Relaties zijn nu ook bewerkbaar in het eigenschappen-paneel (type + lag-notatie
2d/3ed/50%/-25e%); nieuwe store-actieupdateSequencemet undo. - Testsuite uitgebreid: 129 → 159 cases (nieuwe batterijen
cases-lag-advanced.jsonencases-driving.json; harness kentlagUnit/lagPercent/drivingSet/truncatedLeadSet).
-
Lag-eenheid per relatie: werkdagen (default) of kalenderdagen (24/7, bv. uitharden
van beton) — IFC-conform als
- To-do-lijst (
docs/TODO.md) toegevoegd en vanuitCLAUDE.mdverwezen. - Dit changelog-document toegevoegd en vanuit
CLAUDE.mdverwezen. - README-screenshots aangevuld en documentatie gelijkgetrokken met de actuele code.
-
CLAUDE.md: State-sectie gecorrigeerd, multi-worktree dev-setup, i18n/settings/Rust-feiten bijgewerkt en verwijzing naar de self-test harness toegevoegd. - README-architectuur gecorrigeerd: app-shell volgt Open 2D Studio / OpenFEM2D Studio, terwijl het extensiesysteem en de styling naar Open Calc Studio gemodelleerd zijn.
- Spec voor de moderne UI-overhaul (Polished Forge + Soft Depth) toegevoegd.
-
read_file/write_filein de Rust-backend gedocumenteerd als bewuste escape-hatch.
-
Snap-packaging werkend gemaakt —
snap/snapcraft.yamltoegevoegd (core22, strict confinement, gnome-extensie) die de release-deb herverpakt.snap.ymlherschreven: triggert nu op tag-push énworkflow_dispatch, downloadt de release-deb i.p.v. de Tauri-app opnieuw te bouwen, hangt de.snapals release-asset, en publiceert naar de Snap Store zodra hetSNAPCRAFT_STORE_CREDENTIALS-secret bestaat. Follow-ups: in-app updater overslaan binnen de snap, en Store-registratie van de naam. -
Multi-document (back-end) —
documentSlicehoudt meerdere geopende projecten bij; het actieve document leeft op top-level (alle bestaande slices/renderer ongewijzigd), inactieve als payload-snapshot. ActiesnewDocument/switchDocument/closeDocument+getOpenDocuments. View (zoom/scroll), undo-historie, selectie en dirty-status zijn per document; het klembord is gedeeld zodat takken tussen documenten te kopiëren zijn. -
Multi-document (UI) — drie wisselstijlen, kiesbaar in Instellingen (verschijnt in alle drie
de settings-oppervlakken) met default Horizontale tabbladen: horizontale tabbladen onder
het lint (A), verticale tabbladen (projectbalk) links met hover-flyout (B) en een pil in
de titelbalk (C). Alle drie delen één projectoverzicht-overlay (kaarten met mini-Gantt +
taken/kritiek/einde per document). Per project een stabiele identiteitskleur (afgeleid uit de
project-id) en 2-letter-code. Bestand openen opent voortaan een nieuw tabblad (hergebruikt het
lege beginscherm); 'Nieuw' opent een nieuw tabblad i.p.v. het actieve te wissen;
⌘/Ctrl 1–9springt naar het n-de open document. Front-end-only, UI-state in deui-slice. -
Multi-document recovery — auto-save bewaart nu alle open documenten: één manifest
(
recovery[.<slug>].documents.json) + per document een IFC-snapshot, met opruimen van snapshots van gesloten documenten. Bij het opstarten worden alle documenten hersteld (id's, actief document en dirty-status blijven behouden); de oude losserecovery.ifcwordt nog herkend als terugval. Tauri-only. - Sluit-bevestiging (3-weg) — een document met niet-opgeslagen wijzigingen sluiten toont nu een dialoog met Opslaan / Niet opslaan / Annuleren i.p.v. een simpele bevestiging. Opslaan bewaart het document (maakt het zo nodig eerst actief, evt. via 'Opslaan als…') en sluit het daarna; bij een geannuleerd opslaan blijft het document open.
-
Nieuw-project wizard —
ProjectInfoDialogis nu dubbel-modus: naast 'projectinfo bewerken' ook een wizard die bij Nieuw een project opzet met naam/opdrachtgever/startdatum, een kalender-preset (bouwkalender NL incl. bouwvak / NL-feestdagen zonder bouwvak / 5-daags) en een fasering-template (Leeg / Woningbouw / Utiliteitsbouw) die de WBS met hoofdfasen vult. Alle 'Nieuw'-acties (titelbalk, lint, menubalk, Backstage) enCtrl/⌘ Nopenen de wizard;createNewProjectmaakt het project atomair (geen undo-ruis) in een eigen tabblad (hergebruikt een leeg, ongewijzigd tabblad). Hiermee is Fase 1 compleet. - Taken kopiëren/plakken — Ctrl+C / Ctrl+V dupliceren de geselecteerde takken inclusief subtaken, interne relaties en resource-toewijzingen. Geplakt als sibling van de selectie (of op rootniveau) met verse ids; één undo maakt het ongedaan.
- Extensiesysteem — extensies (manifest + main.js, als ZIP/JS of uit de catalogus) kunnen importers en ribbon-knoppen registreren. Beheer via Bestand → Extensies; importeren via Bestand → Importeren. Naar het model van Open Calc Studio.
-
Extensie-SDK —
require('open-planner-studio')geeft nu een echte host-SDK (versie, categorieën/permissies,hostEvents,utilsenfactory-helpers) i.p.v. een leeg object. -
Host-events — de app zendt
host:project-loaded,host:project-newenhost:schedule-calculatedop de extensie-event-bus; extensies kunnen erop abonneren viaapi.events.on. -
Voorbeeld-extensie —
examples/extensions/voorbeeld-takenlijst-importer/als werkende referentie (importer + ribbon-knop + host-event); ook gepubliceerd in de catalogus. -
Extensie-catalogus — publieke repo
OpenAEC-Foundation/open-planner-studio-extensionsmetcatalog.json; Bladeren toont en installeert er extensies uit. ZIP's viarawgehost (release-assets falen op browser-CORS);fetchCatalogmetcache:'no-store'tegen stale data. - Settings unificatie — instellingen gedeeld over tandwiel ⚙, Settings-ribbon-tab en File-backstage via één gedeelde settings-component.
- Gantt — instelbaar scrollen en zoomen over de Gantt-weergave.
-
UI — herbruikbare themed
Select-dropdown met migratie weg van native selects. - Dev — poort en recovery-bestand per worktree geïsoleerd, zodat meerdere desktop-builds tegelijk kunnen draaien.
- Tauri — Linux desktop-icoon metadata.
-
Devtools — Tier 2
ops-testcontrolekanaal (echte Tauri save/open + dispatch).
- UI moderne overhaul — koele "Soft-Depth"-look over alle oppervlakken (Fase 1 koele tokens, schaduw/radius, AA-control-rand en fonts; Fase 2 doorgevoerd over de hele app).
-
Store-architectuur — de monolithische Zustand-store is opgesplitst in tien slices
(
src/state/slices/);appStore.tsis nu een compositie-root. Geen gedragswijziging. - Performance — O(n³)/O(n²) lookups in IFC-nesting en het tekenen van Gantt-pijlen weggewerkt.
-
isTauri()gecentraliseerd insrc/utils/platform.ts. - CI naar Node 24-compatibele GitHub Actions-versies gebracht.
- CODEOWNERS bijgewerkt naar de nieuwe product owner.
-
Updates — het handmatige
.deb-installeercommando in de update-dialog matchte per ongeluk óók hetamd64.deb.sig-asset, waardoor$urltwee URL's bevatte encurlfaalde met "URL rejected: Malformed input to a URL function". De grep matcht nu op de afsluitende quote. - Scheduler — kritiek pad klopt nu; geen spook-float meer op predecessors.
-
Scheduler —
runCPMkan niet meer bevriezen of crashen op rare/ongeldige data. - UI — light-mode contrast verbeterd (diepere tint, zichtbare randen/lijnen, helder amber, extra contrast op canvas-lijnen).
-
Extensies —
minAppVersionwordt nu afgedwongen; een te oude app weigert te activeren. -
Extensies — catalogus-foutmelding via i18n-interpolatie (
{{error}}) i.p.v. string-plakken (alle 14 locales); catalogus-installfouten worden in de kaart getoond. - Extensies — ZIP-parser leest maten uit de central directory (lost data-descriptor-overshoot op).
-
Resources —
removeResource/unassignResourceruimen verweesde ids intask.resourceIdsop. - Bestanden — XML-import-detectie robuuster (P6 vóór MS Project; onbekend formaat gooit nu).
- i18n — thema-namen worden nu vertaald in de theme-picker.
- Taken — standaard einddatum volgt nu de duur.
- Bestanden — bestandsextensie wordt geborgd bij opslaan (Linux/GTK plakt 'm niet).
-
IFC — STEP-entiteiten correct getermineerd met
;(ongeldige IFC-output verholpen), inclusief de voorbeeldgenerator. - Devtools — self-test harness draait op chromium-headless i.p.v. webkit.
public/docs/en/ and docs/wiki/ — direct wiki edits are overwritten on the next release.
Open Planner Studio · LGPL-3.0 · part of the OpenAEC-Foundation
Open Planner Studio
Getting started
Guides
- Planning & WBS
- Relations & constraints
- Calendars & hour planning
- Resources, histogram & leveling
- Baselines & progress
- Critical path & advanced analysis
- Import/export
- Reports & printing
- Keyboard shortcuts & controls
Reference
- Task dialog
- Calendar dialog
- Resource calendar
- Leveling options
- Baseline management
- External links
- Codes & fields (structure)
- Filters
- Choosing columns
- Saving and loading layouts
- Project information
- Settings
- Managing and installing extensions
- Recovering after a crash
- Keyboard shortcut reference
Project