← EnergyViewEnergyView — investeringsprijzen, performance en opruiming
5 november 2026. Basis: broncode rapportcorrecties, oorspronkelijke bronversie 57bfb5e (zipversie 11). Dit is een broncodelevering; niet gepubliceerd naar de live app.
Resultaat en grenzen
A1–A9 zijn uitgevoerd; B1–B3 en C1–C2 zijn afzonderlijk vastgelegd. De rekenuitkomsten van de acht vaste golden-scenario’s zijn exact gelijk, inclusief identifiers en rangorde. De golden-referentie is niet aangepast. Investeringsprijzen zijn volgens de expliciete opdracht gewijzigd; de golden dekt niet alle investeringsprijzen. Daarvoor zijn aparte prijs- en consistentietests gebruikt.
De gevraagde 30% versnelling is niet aangetoond. De gemeten veranderingen zijn kleiner dan de spreiding. Ook de eis dat piekgeheugen niet stijgt is niet gehaald: bij het aankoopplan waren uitschieters tot ongeveer 1,25 GiB. Een lagere mediaan wordt daarom niet als bewezen geheugenwinst gepresenteerd. B5 is niet geïmplementeerd, en B6 is uitsluitend onderzoek.
A — prijzen en consistentie
| Stap | Wijziging | Controle |
|---|
| A1 | Stekkerbatterij all-in: 230 / 290 / 400 €/kWh, minimum €900; offerte heeft voorrang | Prijsbanden, minimum, nulcapaciteit en offerte getest |
| A2 | Standaard elektrisch werk Licht; bestaande expliciete keuzes blijven | Licht €215,71 en Gemiddeld €857,01; opgeslagen preset/details getest |
| A3 | Vaste batterij: basis + €/kWh + omvormer volgens opdracht | 10 kWh typisch €6.100; gezamenlijke PV-omvormer consequent verwerkt |
| A4 | PV volgens nieuwe basisprijzen en tarieven; lager marginaal tarief boven 10 kWp | 4 kWp €4.700; 10 kWp €10.700; 11 kWp €11.550 |
| A5 | Eén batteryPurchaseCost voor plan, studie en bijbehorende UI | Plan en studie voor dezelfde configuratie gelijk; geen dubbele omvormer |
| A6 | Bebat zichtbaar als inbegrepen, indicatief €170–200; niet extra opgeteld | Prijs en zichtbare toelichting gecontroleerd; dubbele identieke prijsalinea verwijderd |
| A7 | Investerings-btw 6%/21%; schattingen ×1,21/1,06 bij 21% | Offertes blijven het ingevoerde brutobedrag; cache-invoer wijzigt mee |
| A8 | Gevoeligheid 10/12/15 jaar bij batterijen zichtbaar | Standaard 15 jaar en bestaande resultaten behouden; alleen vervangingsaantallen afgeleid |
| A9 | Prijzen, bronbeschrijving en bijwerkdatum samen in investment-price-data.js | Datum en 180-dagenverouderingsgrens getest |
De minimumprijs €900 blijft bij grotere capaciteiten gelden als ondergrens: zo ontstaat geen prijsdaling net boven 2,7 kWh. Elektrisch werk behoudt zijn bestaande afzonderlijke btw-instelling; de nieuwe globale keuze betreft PV en batterij. Ingevoerde offertes worden niet stilzwijgend naar een andere btw omgerekend. Alle standaardprijzen blijven schattingen; een echte offerte heeft voorrang. De aangeleverde marktreferenties zijn niet onafhankelijk als actuele verkoopoffertes geverifieerd.
| Voorbeeld, typische schatting | Voor | Na |
|---|
| 5 kWh stekkerbatterij, hardware | €2.085 | €1.450 |
| Zelfde plus standaard elektrisch werk | €2.942,01 | €1.665,71 |
| 10 kWh vaste batterij, zonder nieuwe PV | €8.000 | €6.100 |
| 4 kWp PV | €5.400 | €4.700 |
| 10 kWp PV | €12.600 | €10.700 |
Belangrijkste bestanden: investment-costs.js, investment-price-data.js, electrical-work-cost.js, plan-purchase-costs.js, investment-search.js, investment-ui.js, investment-lifetime-ui.js, report.js, pv-proposal.js en de bijbehorende inputweergave in app.js. Nieuwe tests in investment-price-policy.mjs. Bestaande concrete prijsverwachtingen zijn aangepast aan de expliciet gevraagde prijsformules, niet versoepeld. Geen energieprijs-, dispatch- of kortingsregel gewijzigd in A.
B — gemeten prestaties
Vijf seriële runs per variant, op dezelfde machine en Node-versie, zonder een tweede door ons gestart zwaar proces. Node v24.22.1, Intel Xeon Platinum 8573C. De onderliggende VM is gedeeld: exclusief gebruik van de hele host kon niet worden gegarandeerd. Tijd omvat de berekening; includingImportsMs staat afzonderlijk in JSON. Piek-RSS betreft het Node-proces, geen gemeten browserworker. GC-aandeel komt uit V8 CPU-profielsamples. De medianen liggen rond 8–10%; de eerder genoemde 20% is hier niet gereproduceerd.
Elke run controleerde de volledige resultaatobjecten exact tegen de bestaande golden. Dit zijn synthetische fixtureberekeningen, geen gebruikersbestand of meting op een telefoon.
| Variant | Scenario | Tijd s: mediaan (min–max) | Piek-RSS MiB: mediaan (min–max) | GC %: mediaan (min–max) |
|---|
| Voor | dynamic-ev-battery | 33.84 (29.93–37.13) | 982 (950–1015) | 9.24 (8.49–10.18) |
| Voor | battery-study | 14.33 (12.90–16.32) | 855 (841–874) | 9.94 (9.19–10.45) |
| Voor | purchase-plan | 40.69 (33.72–52.79) | 1075 (1068–1095) | 8.67 (8.18–9.09) |
| Na B1 | dynamic-ev-battery | 30.09 (28.91–40.68) | 985 (959–1007) | 8.51 (8.39–8.75) |
| Na B1 | battery-study | 13.54 (12.32–26.20) | 865 (845–881) | 9.83 (1.02–10.60) |
| Na B1 | purchase-plan | 39.29 (36.63–53.47) | 1025 (987–1248) | 8.49 (8.03–9.41) |
| Na B2 | dynamic-ev-battery | 39.67 (28.25–53.84) | 986 (976–1026) | 8.24 (7.61–12.74) |
| Na B2 | battery-study | 15.38 (11.52–25.38) | 869 (842–877) | 9.59 (5.65–10.84) |
| Na B2 | purchase-plan | 36.91 (34.96–58.46) | 1072 (1013–1245) | 8.59 (7.35–9.84) |
B1 — tijdelijke allocaties
historical.js verplaatst volume- en leverancierkeuzes buiten de maandlus en gebruikt privéwerkbuffers. historical-workspace.js geeft bij geneste aanroepen een afzonderlijke buffer; invoercomponenten worden niet gewijzigd. day-ahead-dispatch.js hergebruikt alleen tijdelijke kostenbuffers, met vrijgave in finally. Uitgaande resultaten en trace-arrays worden niet gedeeld. battery-dispatch.js had al herbruikbare Float64Array-werkruimte en is niet gewijzigd.
Nieuwe historical-scratch.mjs test maandwegingen, identiteit van override-invoer, ongewijzigde tarieven en herintredende berekeningen. Eerste suite: 224/225, uitsluitend de oude UX-bestandsvingerafdruk voor day-ahead-dispatch.js faalde. Daarna waren alle acht golden-objecten exact gelijk. Alleen die bestandsvingerafdruk is expliciet bijgewerkt voor de gevraagde B1-allocatiewijziging; de bytecontrole blijft actief. Herhaalde volledige suite eindigde met exitcode 0. Geen golden gewijzigd. Deze eerste fout is niet verborgen.
B2 — exact hergebruik
report-pricing.js verwerkt dezelfde contracttabellen eenmaal binnen één vaste snapshot en memoïseert herprijzen per product/profielidentiteit. Nieuwe snapshot-pricing-cache.js en test onderscheiden nieuwe invoer/snapshots en bewaren fouten niet. Geen globale cache van veranderlijke marktgegevens. 226/226 tests en acht exact gelijke golden-resultaten. Vijf nametingen tonen geen bewezen tijdswinst; ook een regressie is door de grote overlappende spreiding niet overtuigend geïsoleerd. Deze cache mag niet als behaalde 30%-optimalisatie worden verkocht.
B3 — workerpool
analysis-pool.js geeft desktops met minstens acht cores twee slots bij onbekend geheugen. Mobiele hints, Android/iPhone/iPad en iPadOS-desktopmodus blijven op één slot; bekend beperkt geheugen ook. Zware studies blijven exclusief, om bestaande tijdgebonden zoekvolgorde te behouden en gelijktijdige GiB-belasting te vermijden. Alleen lichtere taken kunnen de twee slots delen.
analysis-pool.mjs test deze gevallen en de exclusiviteit. 226/226 tests en acht exact gelijke golden-objecten. Geen browserworker-RSS of poollatency gemeten; de Node-fixtures oefenen deze browserscheduling niet uit. Daarom geen extra vijf irrelevante Node-runs gedaan en geen snelheidsclaim voor Safari/Firefox gemaakt.
B4 — tussenresultaten en voortgang
De bestaande app toont al de berekende contractuitkomst terwijl sturing/batterij nog loopt, met voorlopige status, voortgang en annuleren. Die route is behouden in plaats van een extra grove DP-reeks toe te voegen. Onder meer teaser-analysis-reuse.mjs en de status-/pooltests zijn in de geslaagde suite uitgevoerd. Geen nieuwe fictieve tussenprijs of rekenmethode toegevoegd. Werkelijke bediening en responsiviteit zijn in deze ronde niet in een browser gezien.
B5 — nog geen solverwijziging
Er is alleen een voorstel. De nieuwe continue solver is niet gebouwd; er bestaat dus geen oud/nieuw B5-verschilrapport. De huidige golden-gelijkheid is geen bewijs dat een toekomstige solver gelijk zal zijn. Eerst is akkoord nodig om een afzonderlijke proefimplementatie te bouwen. Daarna volgen LP-referentie, fysieke grenzen, determinisme, vijf runs en verschilrapport per scenario. Pas daarna kan een tweede expliciet akkoord de actieve solver en eventueel de golden wijzigen. Zie 20261105-b5-b6-voorstel.md. Bestaande LP-fixtures zijn niet overschreven.
B6 — onderzoek, niet gebouwd
Een LP geeft alleen een bruikbare bovengrens op voordeel als de toegelaten dispatches aantoonbaar een deelverzameling van de ontspanning zijn én volledige kosten, aankoop/vervanging, eigen nulreferentie en capaciteitstarief consequent worden meegenomen. Een energie-only bound kan een batterij met piekvoordeel ten onrechte afvoeren. De notitie bevat een synthetisch tegenvoorbeeld met €0 energievoordeel maar €125 piekvoordeel. Dit gebruikt een fictieve tariefcoëfficiënt, niet een app-tarief.
Een bewijs dat iets niet kan winnen bewaart bovendien niet alle exacte bedragen en de volledige rangschikking. Daarom geen kandidaatfilter ingevoerd. Algemene veilige afvoer voor alle huidige kosten-/risicoregels is niet bewezen.
C — build en diagnostiek
C1: Pages levert alleen de gehashte data.json en gas-data.json; de dubbele stabiele kopieën zijn verwijderd. Besparing: 1.989.508 + 2.077.570 = 4.067.078 bytes ruw, circa 154.934 bytes gzip van die twee bestanden. Dit is geen gemeten netwerk- of laadtijdwinst: de app gebruikte al de gehashte namen. Worker en HA behouden de stabiele namen voor bestaande routes en compatibiliteit.
Gerichte controles bundled-assets.mjs, deployment-source.mjs en pages-package.mjs: 3/3 geslaagd. Ze bouwen Pages/Worker/HA, controleren exacte datasets, gehashte verwijzingen en reproduceerbaarheid. Geen extra volledige rekenrun herhaald: alle src/-bytes zijn sinds de laatste B3-golden ongewijzigd. Zo worden afgeronde zware controles hergebruikt zoals gevraagd.
C2: lint blijft 737, actuele typemeldingen dalen van 484 naar 469. De opgeslagen toegestane typebaseline bevatte 496 meldingen; die is teruggebracht naar exact de huidige 469. Automatisch gecontroleerd dat geen nieuw meldingsgroepje of extra toegestane melding is toegevoegd. Lint, typecheck en format:check zijn groen na de laatste code-/buildwijzigingen.
Het herhaalbare meetcommando is opgenomen als npm run perf:series -- --out=.perf-results/review. Standaard vijf seriële runs per zwaar scenario; minder dan vijf wordt geweigerd. Het schrijft JSON, V8 CPU-profielen, medianen en spreiding, en controleert exacte golden-gelijkheid. Dit commando is niet opnieuw gestart na het toevoegen aan package.json: dezelfde gebruikte harnasscriptlogica is overgenomen en alleen geformatteerd.
Bewijs, bronvergelijking en niet geverifieerd
Laatste volledige suite B3: 226/226 geslaagd; acht golden-objecten exact gelijk. Daarna alleen buildscript, test, meet-/documentatiebestanden en de strengere diagnosticbaseline gewijzigd. De drie betrokken buildtests zijn gericht uitgevoerd. Geen nieuwe volledige suite geclaimd na die buildopruiming. Door de eigenaar gevraagde hergebruik van afgeronde tests is zo toegepast.
source-byte-comparison.json vergelijkt de oorspronkelijke bron met de levering. Negen van de tien eerder beschermde rekenmodules zijn byte-identiek. Alleen day-ahead-dispatch.js verschilt door de expliciet gevraagde tijdelijke bufferwijziging in B1; alle bijbehorende rekenresultaten zijn exact gelijk getest. investment-risk.js is bovendien byte-identiek: de eerder voorgestelde tijdvenstercorrectie is niet toegepast. De oude UX-hashwijziging staat apart in Git en het verslag hierboven.
Niet uitgevoerd of bewezen in deze ronde: echte browser, Safari/iOS, Firefox, fysieke Android/telefoon, browserworker-geheugen, mainthreadtaken/CLS/Lighthouse, daadwerkelijke HA-bediening, live Cloudflare-uitrol, gebruikerstest, onafhankelijke actuele winkelprijzen, continue solver en algemeen veilige kandidaatpruning. Geen CSP-versoepeling, runtime-afhankelijkheid, analytics of nieuwe browserdataverzending toegevoegd.
De Gitgeschiedenis in deze levering bevat een lokale import van de officiële zip en afzonderlijke wijzigingen. De importhash is geen productieversie. A1–A6 zijn na een eerdere omgevingsherstart gereconstrueerd en gezamenlijk opnieuw geverifieerd; oorspronkelijke losse ruwe logs waren niet allemaal behouden. Het bewijs noemt dat expliciet en verzint geen ontbrekende logs. Omgeleide uitvoer had soms een onvolledige staart; de afgeronde toolprocessen en exacte objectverificatie vormen dan de eindstatus.
Beslissing van de eigenaar
Alleen voor B5: akkoord om een afzonderlijke proefsolver te bouwen en te vergelijken, zonder activatie of goldenwijziging? Activatie en een eventuele nieuwe golden vragen later een afzonderlijk akkoord na het verschilrapport. Voor de overige uitgevoerde stappen is geen nieuw akkoord nodig.
Afzonderlijke commits
a63592e docs Propose continuous dispatch and document safe bound limitations without implementation
1ce6c0a perf Add reproducible serial five-run profiling command
e7e6c9a C2 Prune resolved type diagnostics without accepting any new groups
2022cc6 C1 Omit redundant stable datasets from Pages while preserving HA and Worker assets
28ced65 B3 Allow two light desktop slots without deviceMemory and keep heavy jobs exclusive
b18e684 B2 Reuse parsed contracts and exact repricing within immutable snapshots
ecbcbd4 B1 Reuse private repricing and day-ahead scratch without changing dispatch results
5e9620d A9 Keep investment estimate values and freshness metadata together
916718e A8 Show 10 12 and 15 year battery lifetime sensitivity without changing the default
f9d721b A7 Add VAT choice for indicative PV and battery purchases while preserving all-in quotes
c85fc19 A6 Restore previously tested price change after environment reset
74f3121 A5 Restore previously tested price change after environment reset
14633c8 A4 Restore previously tested price change after environment reset
67ba01c A3 Restore previously tested price change after environment reset
96b2755 A2 Restore previously tested price change after environment reset
8eead01 A1 Restore previously tested price change after environment reset