Skip to main content

Open punten, ontwerpbesluiten en Technisch Ontwerp-besluitenregister

26.1 Doel van dit hoofdstuk

Dit hoofdstuk bundelt de belangrijkste technische ontwerpbesluiten, implementatieverificaties en aandachtspunten voor de V1.0-baseline van het Technisch Ontwerp. De inhoudelijke uitwerking staat in de betreffende hoofdstukken; dit hoofdstuk bewaakt dat de gemaakte keuzes traceerbaar blijven en dat resterende verificaties niet verspreid raken over losse tekstpassages.

Het aanvullende register to-open-punten-en-besluiten bevat de praktische detailregistratie van besluiten en aandachtspunten. Dit hoofdstuk is de samenvattende baseline-laag. Wanneer een detailpunt definitief wordt opgelost, hoort de uitkomst in het relevante inhoudelijke hoofdstuk of in de bron waar de wijziging thuishoort.

26.2 Afbakening

Dit hoofdstuk introduceert geen nieuwe functionele requirements. Wanneer een aandachtspunt leidt tot een nieuwe of gewijzigde functionele regel, moet die wijziging worden verwerkt in het Functioneel Ontwerp, de Software Requirements Specification, de schermdocumentatie, usecases of database-informatie voordat zij als technische implementatiekeuze wordt toegepast.

OnderwerpHoort hier thuis?Toelichting
Technisch ontwerpbesluitJaBijvoorbeeld keuze voor modulegrenzen, DbContexts, schema's, loggingpatronen of retrybeleid.
ImplementatieverificatieJaBijvoorbeeld controle op TickerQ-configuratie, Content Security Policy of EF Core migration history.
Operationeel aandachtspuntJaBijvoorbeeld backup/restore, monitoring, deployment of incidentafhandeling.
Nieuwe functionele eisNeeHoort in Functioneel Ontwerp en Software Requirements Specification en daarna pas in het Technisch Ontwerp.
Volledige tabeldefinitieNeeDatabase-informatie blijft bron voor tabeldetails, kolommen, enumwaarden en relationele broninformatie.
Story-specifieke implementatietaakAlleen samengevatDetailtaken horen in issue- of storyregistratie; dit hoofdstuk bewaakt alleen ontwerpimpact.

26.3 Statuswaarden

StatusBetekenis
VastgelegdDe keuze is onderdeel van de V1.0-baseline van het Technisch Ontwerp.
ImplementatieverificatieDe ontwerprichting is vastgesteld, maar concrete technische configuratie of tooling moet vóór implementatie aantoonbaar worden gevalideerd.
Buiten huidige baselineHet onderwerp is bewust niet nodig voor de V1.0-baseline en vereist een nieuw ontwerpbesluit voordat het wordt toegevoegd.
VervallenHet punt is bewust niet meer van toepassing.
Escaleren naar Functioneel Ontwerp, Software Requirements Specification of database-informatieHet punt raakt functionele regels, requirements of datamodelbroninformatie en hoort niet uitsluitend in het Technisch Ontwerp te worden opgelost.

26.4 Vastgelegde ontwerpbesluiten

IDBesluitStatusPrimaire verwijzing binnen het Technisch Ontwerp
TO-BES-001OefenHub wordt uitgewerkt als middel-zware modulaire monoliet: één deploybare applicatie met expliciete modulegrenzen.VastgelegdHoofdstuk 01, 02, 03
TO-BES-002De eerste technische baseline gebruikt één relationele database en één applicatieconnectionstring.VastgelegdHoofdstuk 02, 07, 20
TO-BES-003Eén domeinproject heeft maximaal één eigen DbContext en daarmee één primair databaseschema.VastgelegdHoofdstuk 02, 06, 07
TO-BES-004Databaseschema's worden in kleine letters geschreven; tabellen en kolommen gebruiken PascalCase.VastgelegdHoofdstuk 02, 07
TO-BES-005Er komen in de basis geen aparte projecten OefenHub.Audit, OefenHub.Security, OefenHub.Workflows of OefenHub.ReadModels.VastgelegdHoofdstuk 02, 06, 19, 20
TO-BES-006Audit en history worden primair domeinspecifiek opgeslagen naast de brondata van het domein.VastgelegdHoofdstuk 06, 14, 19, 25
TO-BES-007Security wordt volledig beschreven, maar verdeeld over Web, Infrastructure, Identity, Authorization, Scheduling en domeinmodules.VastgelegdHoofdstuk 19, 20
TO-BES-008OefenHub.Practice is de module voor oefenruns, voortgang, resultaten, gedeelde oefeningen en PDF-brondata.VastgelegdHoofdstuk 02, 10
TO-BES-009Module-implementaties zijn standaard internal; alleen publieke contracten in Contracts zijn bedoeld voor gebruik door andere modules.VastgelegdHoofdstuk 03
TO-BES-010OefenHub.Web bevat UI-compositie, routing en viewmodels, maar geen domeinlogica, DbContexts of module-interne entities.VastgelegdHoofdstuk 03, 24
TO-BES-011Cross-module verwijzingen zijn standaard soft links of soft links met snapshot; harde foreign keys over modulegrenzen zijn uitzondering.VastgelegdHoofdstuk 06, 07
TO-BES-012Foreign key + snapshot wordt primair binnen hetzelfde domein toegepast; over modulegrenzen geldt soft link + snapshot als standaardpatroon.VastgelegdHoofdstuk 07, 25
TO-BES-013Per cross-module workflow wordt expliciet bepaald welke stappen onderdeel zijn van de functionele transactie.VastgelegdHoofdstuk 03, 07, 12, 14, 18
TO-BES-014Een systeembericht kan kritiek of retrybaar zijn afhankelijk van de functionele rol binnen de workflow.VastgelegdHoofdstuk 12, 13, 14, 18
TO-BES-015OefenHub.Scheduling is eigenaar van de technische joblifecycle zodra een job succesvol is aangemaakt.VastgelegdHoofdstuk 18, 21
TO-BES-016Domeinmodules blijven eigenaar van de domeinlogica die door jobs wordt uitgevoerd.VastgelegdHoofdstuk 18
TO-BES-017TickerQ wordt gebruikt voor periodieke en uitgestelde verwerking; er komt geen RabbitMQ of externe message broker in de eerste baseline.VastgelegdHoofdstuk 18, 21
TO-BES-018Module-eigen readmodels staan onder Models/ReadModels; er komt geen centraal ReadModels-project in de basis.VastgelegdHoofdstuk 03, 17
TO-BES-019Concrete oefenmodules gebruiken de naamvorm OefenHub.Modules.<ModuleCategory>.<ModuleName>.VastgelegdHoofdstuk 02, 09
TO-BES-020Concrete oefenmodules gebruiken OefenHub.Modules.Abstractions als primaire afhankelijkheid.VastgelegdHoofdstuk 09
TO-BES-021Gebruik van OefenHub.SharedKernel door concrete oefenmodules is toegestaan wanneer dit aantoonbaar generieke duplicatie voorkomt.VastgelegdHoofdstuk 03, 09
TO-BES-022PDF-bestanden zijn tijdelijke output; Practice blijft bron van run- en resultaatdata.VastgelegdHoofdstuk 10, 16, 25
TO-BES-023SignalR is transport voor realtime updates; Practice blijft bron van oefenvoortgang.VastgelegdHoofdstuk 10, 15
TO-BES-024Testprojecten worden per module georganiseerd onder een solution folder of fysieke map tests.VastgelegdHoofdstuk 02, 03, 23
TO-BES-025Architecture tests bewaken dependencyregels aanvullend op internal en projectreferences.VastgelegdHoofdstuk 03, 23
TO-BES-026Seeddata is module-eigen, idempotent en mag beheerbare content niet ongemerkt overschrijven.VastgelegdHoofdstuk 07, 08, 13, 20
TO-BES-027Iedere relevante technische flow draagt een correlation-id door voor logging, jobs en cross-module herleidbaarheid.VastgelegdHoofdstuk 18, 19, 21
TO-BES-028Fallbackgedrag mag autorisatie, privacy, brondata of historische reconstructie nooit omzeilen.VastgelegdHoofdstuk 22, 25
TO-BES-029Accountanonimisering gebruikt vaste waarden: FirstName = Anoniem, MiddleName = #, LastName = <niet-voorspelbare systeemcode> en Email = anoniem.<code>@verwijderd.acc.VastgelegdHoofdstuk 25
TO-BES-030Serilog met Seq is de loggingbaseline voor gestructureerde technische logging en centrale loganalyse.VastgelegdHoofdstuk 19, 21
TO-BES-031Aspire wordt alleen gebruikt als development-only ondersteuning voor configuratie-, dependency- en secrets-pariteit.VastgelegdHoofdstuk 20
TO-BES-032OefenHub heeft in de eerste baseline geen publieke functionele API-laag voor externe clients of mobiele apps; desktop en tablet zijn leidend.VastgelegdHoofdstuk 02, 22, 24
TO-BES-033MudBlazor is de primaire componentenbibliotheek voor de interactieve Blazor Web UI, toegepast via een eigen OefenHub-componentenlaag en niet als losse pagina-opbouw of domeinafhankelijkheid.VastgelegdHoofdstuk 24
TO-BES-034ArchUnitNET is de primaire tooling voor architecture tests in OefenHub.ArchitectureTests; NetArchTest is geen baseline.VastgelegdHoofdstuk 02, 23
TO-BES-035PDF-regressietests gebruiken primair structurele Verify/PdfPig-snapshots en beperken visuele golden masters tot stabiele kernlayouts; byte-identieke PDF-vergelijking is geen primaire regressiemethode.VastgelegdHoofdstuk 16, 23
TO-BES-036De initiële materialisatiekandidaten voor readmodels zijn vastgesteld; mailbox-, badge-, ticket-, guardian-summary- en zware beheerprojecties zijn kandidaat, terwijl geschiedenisdetails, PDF-export en live availability querymatig of runtime blijven tenzij meetgegevens anders aantonen.VastgelegdHoofdstuk 17, 22
TO-BES-037Beheerbare seeddata voor popups, systeemberichttemplates, systeeminstellingen, featuretoggles, notificaties en contentblokken gebruikt stabiele technische keys, create-if-missing-seeding en expliciete migratie/backfill voor technische wijzigingen; beheerwaarden worden niet stilzwijgend overschreven.VastgelegdHoofdstuk 07, 13, 20
TO-BES-038Aspire-developmentpariteit is gevalideerd als development-only inrichting met vaste guardrails voor scope, projectgrens, configuratiebinding, secrets, lokale data en observability; productiegebruik van Aspire vereist een nieuw besluit.VastgelegdHoofdstuk 20
TO-BES-039De MudBlazor- en OefenHub-componentenstrategie is gevalideerd: MudBlazor blijft Web-only componentbasis, OefenHub levert theme en herbruikbare wrappercomponenten, en HTML-mockups blijven ontwerpinput in plaats van implementatiecode.VastgelegdHoofdstuk 24
TO-BES-040De backup- en restorebaseline gebruikt een RPO van maximaal 5 × 24 uur en een RTO van maximaal 3 werkdagen na restorebesluit; high-availability, active-active, hot standby en zero-downtime restore vallen buiten de V1.0-baseline.VastgelegdHoofdstuk 21, 25
TO-BES-041De V1.0-performancegrenzen per hoofdflow zijn vastgesteld als lichte richtwaarden voor acceptabele performance; OefenHub krijgt geen top-tier latency- of high-scale-performancebaseline.VastgelegdHoofdstuk 22, 23
TO-BES-042EF Core migration history staat per persistente module-DbContext in het eigen schema als __EFMigrationsHistory; een centrale gedeelde historytabel zonder contextonderscheid is niet toegestaan.VastgelegdHoofdstuk 07, 23
TO-BES-043Tijdelijke PDF-output wordt buiten webroot opgeslagen via OefenHub:Reporting:TempExportPath, standaard na 24 uur cleanupeligible en minimaal iedere 6 uur opgeschoond; achterstand vanaf 48 uur wordt zichtbaar gemaakt.VastgelegdHoofdstuk 16, 18, 21, 25
TO-BES-044Blazor componenttests gebruiken bUnit en end-to-endtests gebruiken Playwright .NET; E2E-dekking blijft beperkt tot primaire smoke- en regressieflows.VastgelegdHoofdstuk 23, 24
TO-BES-045SignalR live-reconnect gebruikt vijf automatische pogingen met delays 0, 2, 10, 30 en 60 seconden; na falen toont de UI een veilige verbroken status en wordt actuele server-side state bij reconnect opnieuw opgehaald.VastgelegdHoofdstuk 15, 22, 23, 24
TO-BES-046Serilog-/Seq-configuratie en logretentie zijn vastgesteld als lichte V1.0-baseline met centrale configuratie, Seq als interne viewer, privacybewuste scrubbing en begrensde retentietermijnen per omgeving/logcategorie.VastgelegdHoofdstuk 19, 21, 25
TO-BES-047Securityevents blijven standaard technische logs in Serilog/Seq; er komt geen generieke persistente securityeventtabel of apart securityschema in V1.0. Persistente opslag gebeurt alleen wanneer een domeinactie functioneel bronhoudende historie vereist.VastgelegdHoofdstuk 19, 20, 25
TO-BES-048De CSP-baseline staat externe bronnen standaard niet toe, gebruikt geen inline scripts, staat inline styles alleen beperkt toe voor Blazor/MudBlazor, en wordt centraal in OefenHub.Web als header geconfigureerd.VastgelegdHoofdstuk 20, 23, 24
TO-BES-049Rate limiting wordt per routecategorie ingericht met lichte V1.0-limieten voor publieke pagina's, login/provisioning, Blazor UI, relaties, berichten, tickets, search/filter, PDF-export, beheer, SignalR en interne tooling.VastgelegdHoofdstuk 20, 22, 23
TO-BES-050De eerste technische oefenmodulecategorie is Arithmetic en de eerste concrete technische oefenmodule is OefenHub.Modules.Arithmetic.AdditionSubtractionSimple, functioneel beschreven als Optellen & Aftrekken (simpel) binnen het moduledossier oefen_modules/rekenen/optellen_en_aftrekken_simpel.VastgelegdHoofdstuk 02, 03, 09, 23
TO-BES-051Cross-module transaction boundaries voor V1.0-kritieke workflows zijn gevalideerd; primaire bronmutaties liggen bij de functionele eigenaar en afgeleide signalering, readmodels, caches, PDF-generatie, e-mail en SignalR blijven idempotent of retrybaar waar dat veilig is.VastgelegdHoofdstuk 03, 07, 12, 14, 18, 25, 26
TO-BES-052Moq is de baseline mockinglibrary voor interface-gebaseerde unit-testmocks, tenzij een concrete testbehoefte of security-/dependencyreview een afwijking vereist.VastgelegdHoofdstuk 23
TO-BES-053Technische logging gebruikt Engelstalige eventnamen, propertynamen en vaste logmessage-templates; gebruikersgerichte teksten blijven Nederlandstalig.VastgelegdHoofdstuk 19
TO-BES-054Retrydefaults per jobtype zijn vastgesteld als lichte V1.0-baseline met beperkte retries voor periodieke/onderhoudsjobs, ruimere retries voor maildelivery en beheer-/supportgestuurde hersteljobs.VastgelegdHoofdstuk 18, 21, 23
TO-BES-055De secretbaseline voor de eerste Docker-livegang gebruikt met het huidige inzicht file-based secrets via Docker Compose secrets, read-only secretbestanden of, bij Swarm, Docker/Portainer secrets; de exacte route blijft afhankelijk van deploymentinrichting.VastgelegdHoofdstuk 20, 21

26.5 Implementatieverificaties en aandachtspunten

Onderstaande punten blokkeren de V1.0-baseline niet, maar moeten vóór of tijdens implementatie aantoonbaar worden opgelost. Punten met status “Escaleren naar Functioneel Ontwerp, Software Requirements Specification of database-informatie” mogen niet uitsluitend als technische keuze worden afgehandeld.

IDAandachtspuntStatusGewenste uitkomstPrimaire verwijzing binnen het Technisch Ontwerp
TO-OPEN-001TickerQ-tabellen in schema scheduling plaatsen.ImplementatieverificatieConcrete configuratie voor schema, migrations en deployment.Hoofdstuk 18, 21
TO-OPEN-002TickerQ-webinterface intern beschikbaar en afgeschermd maken.ImplementatieverificatieAlleen intern/bevoegd toegankelijk dashboard met logging van beheeracties.Hoofdstuk 18, 20, 21

26.6 Workflowmatrix voor transactionele keuzes

Voor iedere cross-module workflow wordt in het relevante hoofdstuk of in het register een compacte matrix gebruikt. De matrix voorkomt dat kritieke stappen per ongeluk retrybaar worden gemaakt of dat niet-kritieke side-effects onnodig atomair worden gekoppeld.

VeldInvulling
WorkflowNaam van de gebruikersactie of achtergrondactie.
Functionele eigenaarModule die de workflow inhoudelijk bezit.
Betrokken modulesModules die via publieke contracten worden aangeroepen.
Kritieke stappenStappen die samen de functionele uitkomst bepalen.
Retrybare stappenStappen die veilig opnieuw kunnen worden uitgevoerd.
Transaction boundaryEén moduletransactie, gedeelde transactie, compensatie of failed-status.
GebruikersfeedbackWat de gebruiker ziet bij succes, functioneel falen of technisch falen.
CorrelationWelke correlation-id en identifiers in logs/jobs worden vastgelegd.
HerstelpadAutomatische retry, beheeractie, nieuwe gebruikersactie of technische analyse.

Voorbeeld:

WorkflowFunctionele eigenaarKritieke stappenRetrybare stappenTransaction boundary
Relatie-uitnodiging versturenRelationshipsUitnodiging aanmaken, conflictcontrole, primair systeembericht wanneer dit de enige acceptatie-ingang isBadge-update, optionele tellerverversingAtomair voor kritieke stappen; retrybaar voor afgeleide signalering
Ticket oplossenSupportTicketClosure, statuswijziging, support-historySysteembericht wanneer dit niet de enige functionele ingang is, badge-update, readmodelverversingKritieke supportmutaties atomair; communicatie per workflow classificeren
Tijdelijke PDF cleanupScheduling/ReportingGeen gebruikersgerichte bronmutatieBestand verwijderen, technische cleanupstatusRetrybaar en idempotent

26.7 Richtlijn voor hoofdstukopsplitsing

Hoofdstukken mogen worden opgesplitst wanneer een hoofdstuk te groot wordt voor onderhoud, review of navigatie. Opsplitsen is wenselijk wanneer één hoofdstuk meerdere zelfstandige technische beslisgebieden bevat die afzonderlijk wijzigen.

SignaalActie
Hoofdstuk bevat meerdere zelfstandige technische subdomeinenSplitsen in subpagina's of detaildocumenten.
Tabellen of matrices domineren het hoofdstukOverweeg een registerbestand naast het hoofdstuk.
Eén onderdeel wijzigt veel vaker dan de restVerplaats dat onderdeel naar een apart onderhoudbaar document.
Inhoud is vooral status-/besluitregistratiePlaats detail in register en houd hoofdstuk samenvattend.
Docusaurus-navigatie wordt onoverzichtelijkMaak een indexpagina met onderliggende detailpagina's.

Bij opsplitsing blijven Docusaurus-links extensieloos en blijft de inhoudelijke bronvolgorde gelijk: Functioneel Ontwerp en Software Requirements Specification voor functionele regels, database-informatie voor datamodelbroninformatie en Technisch Ontwerp voor technische implementatiekeuzes.

26.8 Documentatie-impact bij stories en technische wijzigingen

Iedere story of technische wijziging beoordeelt expliciet of bovenliggende documentatie geraakt wordt. Een wijziging is pas documentatiecompleet wanneer alle geraakte bronnen zijn bijgewerkt of bewust als niet geraakt zijn beoordeeld.

ImpactgebiedVraag
Functioneel Ontwerp-impactVerandert een functionele regel, rolgedrag, lifecycle of gebruikersflow?
Software Requirements Specification-impactVerandert een requirement, acceptatiecriterium, prioriteit of traceability?
Technisch Ontwerp-impactVerandert projectstructuur, modulecontract, workflow, job, logging, security of infrastructuur?
Database-informatie-impactVerandert een tabel, kolom, relatie, constraint, enum, snapshot of datamodelbronregel?
ERD-impactVerandert een relatie of datamodelstructuur die visueel moet worden bijgewerkt?
Schermdocumentatie-impactVerandert schermgedrag, labels, velden, foutmeldingen, filters of zichtbare acties?
Usecase-impactVerandert actorinteractie, hoofdflow, alternatieve flow of foutflow?
TestimpactVerandert benodigde unit-, integratie-, architecture-, security- of end-to-endtests?

26.9 Relatie met het detailregister

Het detailregister wordt gebruikt voor praktische opvolging. Dit hoofdstuk blijft de samenvattende baseline-laag van het Technisch Ontwerp. Wanneer een aandachtspunt definitief wordt opgelost, zijn er drie mogelijke uitkomsten:

  1. het besluit wordt verwerkt in het relevante hoofdstuk van het Technisch Ontwerp;
  2. het punt wordt verplaatst naar Functioneel Ontwerp, Software Requirements Specification of database-informatie omdat het geen puur technische keuze blijkt;
  3. het punt wordt bewust buiten de huidige baseline geplaatst en blijft met reden zichtbaar in het register.

Het register mag geen tweede bron worden voor technische regels die al definitief in hoofdstukken zijn verwerkt. Definitieve regels horen in het relevante hoofdstuk van het Technisch Ontwerp; het register bewaakt status, besluitvorming en opvolging.

26.10 Baseline-controle voor het Technisch Ontwerp

Voor het Technisch Ontwerp als geheel gelden bij baseline minimaal de volgende controles:

ControleVerwachting
HoofdstukkenAlle hoofdstukken van het Technisch Ontwerp zijn inhoudelijk uitgewerkt of bewust buiten de huidige baseline geplaatst.
AandachtspuntenIeder aandachtspunt heeft status, eigenaar of vervolgroute.
BesluitenBelangrijke technische keuzes zijn traceerbaar in dit hoofdstuk of het register.
LinksDocusaurus-links zijn extensieloos.
TabellenMarkdown-tabellen zijn syntactisch geldig.
BronvolgordeHet Technisch Ontwerp spreekt Functioneel Ontwerp, Software Requirements Specification en database-informatie niet tegen.
DatamodelTabeldetails blijven in database-informatie; het Technisch Ontwerp beschrijft vertaling en implementatiekeuzes.
SecuritySecurity is beschreven ondanks ontbreken van een apart securityproject.
LoggingCorrelation, privacygrenzen en foutafhandeling zijn uitgewerkt.
JobsTickerQ, scheduling, retries, failed-statussen en beheerbaarheid zijn beschreven.
PrivacyRetentie, anonimisering, snapshots en exports zijn technisch afgebakend.
TeststrategieModule-, integratie-, architecture-, security- en end-to-endtestlijnen zijn beschreven.