Skip to main content

Functionele beslisregels en uitgangspunten

19.1 Doel

Dit hoofdstuk beschrijft domeinbrede functionele beslisregels en uitgangspunten die in meerdere FO-hoofdstukken terugkomen.

Het hoofdstuk is bedoeld als samenhangende interpretatielaag boven de afzonderlijke domeinhoofdstukken.

Het voorkomt dat dezelfde basisregels in ieder hoofdstuk opnieuw volledig worden uitgeschreven.

Dit hoofdstuk vervangt niet:

  • usecases;
  • schermdocumentatie;
  • database-informatie;
  • ontwerpbronnen;
  • statusmodellen;
  • autorisatiematrix;
  • command-register;
  • event-register;
  • popup-register;
  • TO;
  • SRS.

Wanneer een detailregel in een bronregister of usecase preciezer is uitgewerkt, blijft die bron leidend voor dat detail.

19.2 Bronpositie

Functionele beslisregels hebben binnen het FO een overkoepelende rol.

BronlaagRol voor dit hoofdstuk
FO-hoofdstukkenBeschrijven per domein de functionele samenhang en grensregels.
OntwerpbronnenBevatten bronhoudende business rules, autorisatiematrix, statusmodellen, command- en eventregisters.
UsecasesBeschrijven concrete flows, actoren, stappen, uitzonderingen en acceptatiecriteria.
Database-informatieBeschrijft brondata, history, readmodels, technische grenzen en persistente relaties.
SchermdocumentatieBeschrijft zichtbare schermen, acties, lege toestanden, fouttoestanden en waardelagen.
Oefenmodule-documentatieBeschrijft module-specifieke configuratie, payloads, rendering en antwoordcontrole.
ArchitectuurdocumentatieBeschrijft systeemgrenzen, containers en technische contexten die functionele gevolgen hebben.

Dit hoofdstuk mag dus samenvatten en verbinden, maar hoort geen bronregisters te dupliceren.

19.3 Domeinafbakening

De regels in dit hoofdstuk gelden breed voor OefenHub.

OnderwerpBinnen dit hoofdstukNiet binnen dit hoofdstuk
AutorisatieOverkoepelende server-side beslisregels.Complete autorisatiematrix per route, object en actie.
ContextAlgemene regels rond rol-, relatie-, niveau-, kind-, docent- en beheercontext.Volledige contextresolutie per usecase.
ReadmodelsFunctionele status van readmodels, tellers, badges en filters.Querytechniek, indexing of performanceoptimalisatie.
HistorieAlgemene reconstructie- en auditprincipes.Volledige databasetabellen of technische retentionimplementatie.
MutatiesAlgemene regels rond command, transactie, audit en idempotentie.Concrete commandhandlers of API-contracten.
FoutafhandelingAlgemene privacy- en veiligheidsgrenzen.Exacte popupteksten of UI-copy.
ModulesAlgemene schema- en payloadprincipes.Module-specifieke vraaglogica en configuratievelden.
RealtimeFunctionele grens van live updates.SignalR-implementatie, verbindingstopologie of retrycode.

19.4 Regeltypen

Binnen OefenHub komen meerdere soorten regels voor.

RegeltypeBetekenisPrimaire bron
Business ruleDomeinbrede regel met stabiel BusinessRule-ID.Ontwerpbron business rules.
AutorisatieregelRegel die bepaalt wie wat mag zien of doen.Autorisatiematrix, usecases en FO-domeinhoofdstukken.
StatusregelRegel rond toegestane statussen, overgangen en afgeleide labels.Statusmodellen en domeinhoofdstukken.
CommandregelRegel rond een gebruikersactie of systeemactie.Command-register en usecases.
EventregelRegel rond betekenisvolle domeingebeurtenissen.Event-register en database-/historybronnen.
SchermregelRegel rond zichtbare UI, lege toestand of foutweergave.Schermdocumentatie en UX-hoofdstuk.
DataregelRegel rond brondata, readmodels, history en persistente grenzen.Database-informatie.
Module-regelRegel rond technische oefenmodules en payloadinterpretatie.Oefenmodule-documentatie en module-Fo-hoofdstukken.

Wanneer regels elkaar raken, wordt de meest specifieke bron gebruikt voor de concrete uitwerking.

19.5 Interpretatieregels

Voor het lezen van alle FO-hoofdstukken gelden de volgende interpretatieregels.

RegelBetekenis
FO is functioneelHet FO beschrijft gedrag, samenhang, rollen, grenzen en bronpositie.
TO is technischTechnische implementatiedetails horen in het TO, niet in dit FO.
SRS is toetsbaarRequirements, acceptatiecriteria en testbare eisen worden later in de SRS afgeleid.
Usecases blijven leidend voor flowsHet FO dupliceert geen volledige flowstappen wanneer de usecase bronhoudend is.
Database-informatie blijft leidend voor brondataHet FO benoemt brondata en readmodelgrenzen, maar schrijft geen DDL uit.
Schermdocumentatie blijft leidend voor zichtbare UIHet FO beschrijft schermsamenhang, niet elk label, veld of pixel.
Ontwerpbronnen blijven leidend voor registersBusinessRule-ID’s, popupkeys, commands, events en statuswaarden worden niet vrij hernoemd in het FO.
Open punten horen centraalOnbesliste keuzes worden niet verspreid, maar centraal in open punten vastgelegd.

19.6 Server-side waarheid

Server-side context is leidend voor autorisatie, rolcontext, profielcontext, leerlingtoegang, docentcontext, ouder-/voogdinzage, live meekijken, beheeracties en export.

Een zichtbare knop, menuoptie, badge, kaart, teller, route of filter is nooit voldoende bewijs dat de gebruiker de onderliggende actie mag uitvoeren.

Voor iedere afgeschermde actie geldt minimaal:

  • gebruiker is server-side bekend;
  • account is actief;
  • relevante rolcontext is geldig;
  • relevante relatiecontext is geldig wanneer vereist;
  • relevante objectcontext bestaat;
  • object hoort bij de toegestane dataset;
  • eventuele featuretoggle of systeeminstelling staat de actie toe;
  • status van het object staat de actie toe;
  • de actie wordt gecontroleerd op het moment van uitvoeren.

Clientstate mag deze controles niet vervangen.

19.7 Clientstate en routeparameters

Clientstate heeft uitsluitend presentatiewaarde.

Niet leidend voor autorisatie zijn:

  • browsergeschiedenis;
  • querystrings;
  • routeparameters;
  • lokaal geselecteerde context;
  • oude dropdownselecties;
  • cachewaarden;
  • badges;
  • filters;
  • paginering;
  • clientside storage;
  • browsercookies;
  • oude SignalR-state;
  • reeds geladen schermdata.

Wanneer clientstate verwijst naar een object dat niet meer toegankelijk is, toont OefenHub geen gedeeltelijke data.

De applicatie kiest dan een veilige fout- of niet-beschikbaarafhandeling.

19.8 Rolcontext

OefenHub werkt vanuit expliciete rolcontexten.

RolcontextKernregel
LeerlingNiet combineerbaar met ouder/voogd, docent of beheerder.
Ouder/voogdCombineerbaar met docent en/of beheerder, maar niet met leerling.
DocentCombineerbaar met ouder/voogd en/of beheerder, maar niet met leerling.
BeheerderCombineerbaar met docent en/of ouder/voogd, maar geen vrije bypass op eindgebruikersflows.
TestDocentNiet-publieke rol voor gecontroleerde testmoduletoegang waar functioneel ondersteund.

Een gebruiker met meerdere rollen krijgt geen gemengde autorisatie.

De context van de route en actie bepaalt welke rolgrens geldt.

19.9 Geen gemengde autorisatie

Combinatierollen mogen data niet vermengen.

Voorbeelden:

SituatieRegel
Docent + ouder/voogdDocentroutes geven geen ouder-/voogdrecht en ouder-/voogdroutes geven geen docentrecht.
Beheerder + docentBeheerdercontext geeft geen automatische docentinzage buiten expliciete beheer- of supportflow.
Beheerder + ouder/voogdBeheerdercontext geeft geen reguliere ouder-/voogdinzage zonder eigen ouder-/voogdrelatie.
Docent + ouder/voogd bij hetzelfde kindDe docentrelatie en ouder-/voogdrelatie blijven afzonderlijke autorisatiebronnen.
LeerlingLeerlingcontext wordt niet gecombineerd met volwassen rollen.

Een gecombineerde frontpage mag blokken uit meerdere contexten tonen, maar vervolgacties controleren opnieuw de eigen domeingrens.

19.10 Beheerdercontext is geen vrije bypass

Een beheerder heeft brede beheerrechten, maar niet automatisch dezelfde functionele positie als eindgebruikers.

Daarom geldt:

  • beheerder kan geen leerlingrun maken namens een leerling;
  • beheerder kan niet live meekijken als algemene eindgebruikersfunctie;
  • beheerder ziet geen detaildata buiten expliciet geautoriseerde beheer- of supportflows;
  • beheerder wijzigt geen identity-providercredentials;
  • beheerder gebruikt centrale beheerflows voor categorieën, modules, content, popups, templates, features, systeeminstellingen en accounts;
  • beheerderondersteuning binnen docentcontext blijft supportmatig, auditbaar en begrensd.

Beheeracties zijn altijd server-side geautoriseerd en auditbaar wanneer zij functionele gevolgen hebben.

19.11 Relatiecontext

Relaties zijn functionele autorisatiebronnen.

RelatietypeAutorisatiebetekenis
VriendschapVoor delen van oefeningen en toegestane privécommunicatie tussen leerlingen.
GuardianStudentVoor ouder-/voogdinzage, resultaten, geschiedenis, PDF en live meekijken.
TeacherStudentVoor docent-leerlingtoegang, niveauautorisaties, resultaten en live meekijken binnen docentcontext.
TeacherTeacherVoor samenwerking op niveau- en oefenaanbodlaag.
AdminAdminVoor beheerder-naar-beheerdercommunicatie of beheercontext waar ondersteund.

Een relatie is geen algemene vrijbrief voor alle data.

De actie bepaalt welke relatiecontext relevant is.

19.12 Relatiebeëindiging en historie

Beëindiging van een relatie werkt toekomstgericht.

Bij relatiebeëindiging geldt:

  • toekomstige relatieafhankelijke toegang vervalt;
  • historische oefenruns worden niet verwijderd;
  • historische resultaten blijven functioneel herleidbaar volgens de rol- en privacyregels;
  • berichten en systeemberichten volgen hun eigen zichtbaarheid en retentie;
  • auditrecords blijven bestaan;
  • gedeelde oefeningen behouden hun historische snapshotcontext waar dit functioneel is vastgelegd.

Relatiebeëindiging herschrijft dus geen historische waarheid.

19.13 Niveau- en oefencontext

Leerlingtoegang tot oefeningen wordt bepaald door actuele server-side context.

Minimaal relevant zijn:

  • leerlingaccount;
  • actieve leerlingrol;
  • actieve niveaucontext;
  • toegankelijke categorie;
  • concrete actieve oefening;
  • geldige modulebeschikbaarheid;
  • relatie- en/of autorisatiecontext;
  • status van niveau, categorie, oefening en module.

Een historisch resultaat of eerder geopende pagina geeft geen actuele starttoegang.

19.14 Readmodels

Readmodels mogen worden gebruikt voor:

  • frontpages;
  • overzichtsschermen;
  • tellers;
  • badges;
  • filters;
  • samenvattingen;
  • zoekresultaten;
  • exportvoorbereiding;
  • online-overzichten;
  • livebeschikbaarheid;
  • resultatenoverzichten.

Readmodels zijn geen zelfstandige bron van waarheid wanneer onderliggende domeinrecords bronhoudend zijn.

Een readmodel mag nooit meer data tonen dan de gebruiker via bronrecords zou mogen zien.

19.15 Tellers en badges

Tellers en badges zijn afgeleid.

Voor iedere teller moet functioneel duidelijk zijn:

AspectVraag
ObjectscopeWelke objecten tellen mee?
StatusfilterWelke statussen tellen mee of niet?
RolcontextWelke rol begrenst de telling?
RelatiecontextWelke relatie is vereist?
TijdvensterIs er een periode zoals vandaag, week, maand of recent?
ActiviteitTellen inactieve, verlopen, soft-deleted of testrecords mee?
Distinct-logicaTelt een object één keer of per koppeling?
AutorisatieTelt alleen data die de gebruiker mag zien?

Een teller is nooit autorisatiebewijs.

19.16 Filters, zoeken en paginering

Filters, zoeken en paginering werken altijd binnen de geautoriseerde dataset.

Zij mogen de dataset niet verruimen.

Voorbeelden:

  • mailbox zoeken zoekt alleen in eigen zichtbare mailboxitems;
  • leerlinggeschiedenis filtert alleen eigen toegestane runcontext;
  • docentresultaten filteren alleen binnen docentcontext;
  • ouder-/voogdgeschiedenis filtert alleen binnen actief gekoppelde kinderen;
  • beheerderzoekacties blijven binnen beheercontext en domeinflow;
  • shared-exercise-overzichten tonen alleen eigen zichtbare records.

Geen resultaat is een geldige toestand.

19.17 Commands en mutaties

Een gebruikersactie of systeemactie die data wijzigt, wordt functioneel als command beschouwd.

Voor commands geldt:

  • input wordt server-side gevalideerd;
  • autorisatie wordt opnieuw bepaald;
  • actuele status wordt gecontroleerd;
  • domeinregels worden toegepast;
  • mutaties zijn transactioneel waar zij functioneel samen horen;
  • history of events worden vastgelegd waar vereist;
  • gedeeltelijke mutaties worden voorkomen;
  • foutafhandeling toont geen interne details.

Een command mag niet slagen omdat een knop zichtbaar was.

19.18 Events en history

Events en history leggen betekenisvolle domeingebeurtenissen vast.

Niet iedere readactie hoeft een domeinevent te zijn.

Wel auditbaar zijn onder meer:

  • beheeracties met functioneel gevolg;
  • accountlifecycle;
  • rolmutaties;
  • relatievorming en ontkoppeling;
  • niveauautorisaties;
  • collaborators;
  • eigendomsoverdracht;
  • categorie- en modulemigraties;
  • oefeningconfiguratiewijzigingen;
  • meldingenstatus en sluitingen;
  • heropenverzoeken;
  • live-meekijksessies;
  • systeeminstellingen en featuretoggles;
  • content-, popup- en templatewijzigingen.

History is bedoeld voor reconstructie, audit en support.

History is geen gewone gebruikerscommunicatie.

19.19 Statusmodellen

Statussen moeten per domein eenduidig zijn.

Voor statusmodellen geldt:

  • backendstatussen en gebruikerslabels mogen verschillen;
  • afgeleide gebruikersstatussen worden niet onnodig als aparte databasewaarde opgeslagen;
  • statusovergangen zijn beperkt tot toegestane flows;
  • statuswijzigingen met functionele gevolgen zijn auditbaar;
  • verlopen, geaccepteerd, afgerond, actief, in onderhoud en gesloten betekenen per domein precies wat in dat domein is vastgelegd.

Voorbeeld: Opgelost bij meldingen is een gebruikersgerichte afgeleide toestand en geen aparte backendhoofdstatus.

19.20 Historische reconstructie

Historische runs, gedeelde oefeningen, resultaten en exports moeten functioneel bruikbaar blijven na latere wijzigingen.

Latere wijzigingen kunnen gaan over:

  • categorienaam;
  • categorie-icoon;
  • categoriekleur;
  • modulemetadata;
  • oefeningnaam;
  • oefeningconfiguratie;
  • relatiecontext;
  • autorisaties;
  • docentniveaus;
  • eigenaar of collaborator;
  • accountstatus;
  • persoonsgegevens.

Waar actuele persoonsgegevens zijn verwijderd of geanonimiseerd, blijft reconstructie alleen toegestaan zonder actuele persoonsgegevens.

Historische reconstructie mag privacygrenzen niet doorbreken.

19.21 Geen herschrijven van historische runs

Historische exercise runs worden niet herschreven door latere beheeracties.

Dit geldt in elk geval voor:

  • categoriemigratie;
  • modulemigratie;
  • naamswijziging;
  • statuswijziging van oefening;
  • intrekken van autorisatie;
  • beëindigen van relatie;
  • wijziging van modulemetadata;
  • wijziging van content of templates.

Een run bewaart de relevante historische context die nodig is voor resultaten, geschiedenis, PDF en audit.

19.22 Payloadlagen

OefenHub gebruikt meerdere payloadlagen.

PayloadlaagBetekenis
OefeningconfiguratiepayloadModulespecifieke configuratie van een concrete oefening.
RunpayloadVraag-, antwoord- en volgorde-inhoud van een unieke run.
VraagvoortgangspayloadOperationele voortgang per vraag waar modulespecifieke gegevens nodig zijn.
ExportrepresentatieEventuele module-specifieke representatie voor PDF of resultaatweergave.

Uniforme velden blijven beschikbaar voor generieke overzichten, resultaten, live meekijken en geschiedenis.

Modulespecifieke inhoud blijft binnen de modulegrens.

19.23 ModuleKey en schemaVersion

Voor module- en schemaherleidbaarheid zijn moduleKey en schemaVersion in de bestaande payloads leidend.

Er wordt geen extra generieke databasekolom geïntroduceerd om dezelfde schemaherleidbaarheid dubbel op te slaan.

Functioneel betekent dit:

  • de modulepayload moet haar eigen interpretatiecontext bevatten;
  • moduleversies blijven backwards compatible of leveren migratie-/leeslogica;
  • historische runs blijven leesbaar op basis van opgeslagen payload en context;
  • modulemigratie wijzigt toekomstig gebruik van actieve oefeningen, niet historische runs;
  • het FO dupliceert geen module-specifiek schema.

19.24 Compatibiliteit van modules

Modulemigraties veronderstellen dat backwards compatibility procesmatig is vastgesteld.

OefenHub dwingt niet alle semantische compatibiliteit automatisch hard af.

Wel geldt:

  • modulebeheer mag metadata beheren;
  • testzichtbaarheid kan worden geschakeld waar ondersteund;
  • connectiviteit kan worden getest;
  • migratie kan proefgericht, docentgericht of globaal zijn;
  • migratie is auditbaar;
  • historische runs worden niet herschreven;
  • gedeelde oefeningen en PDF-contexten blijven historisch bruikbaar.

19.25 Resultaten en statistieken

Resultaten zijn gebaseerd op afgeronde oefenruns.

Voor resultaten geldt:

  • niet-afgeronde runs tellen niet als afgerond resultaat;
  • docenttestruns tellen niet als leerlinggeschiedenis;
  • uniforme runvelden zijn leidend voor overzichten;
  • detaildata blijft beschikbaar via opgeslagen runpayload en voortgang;
  • statistieken worden niet uit clientstate afgeleid;
  • PDF-export gebruikt dezelfde historische resultaatbron;
  • resultaatweergave muteert de run niet.

19.26 PDF-export

PDF-export is een read-only exportactie.

Voor PDF-export geldt:

  • export gebruikt historische runcontext;
  • export maakt geen verplichte permanente PDF-records aan;
  • export wijzigt geen run, resultaat of geschiedenis;
  • export controleert opnieuw server-side toegang;
  • export toont geen data buiten de toegestane rolcontext;
  • module-specifieke notatie mag via modulehulp worden geleverd;
  • bestandsnaam en layoutregels volgen FO-18 en de scherm-/modulebronnen.

19.27 Realtime transport

Realtime transport, zoals SignalR, is geen bron van waarheid.

Realtime kan worden gebruikt voor:

  • live meekijken;
  • voortgangsupdates;
  • mailboxbadges;
  • notificatie van relevante communicatie;
  • online-status of aanwezigheid;
  • UI-verversing.

De bron blijft server-side data.

Wanneer realtime updates niet aankomen, wordt de actuele toestand bij herladen of ophalen opnieuw server-side bepaald.

19.28 Live meekijken

Live meekijken is read-only.

Voor live meekijken geldt:

  • docent en ouder/voogd hebben verschillende autorisatiegrenzen;
  • beheerder heeft geen algemene live-meekijkbypass;
  • ExerciseRuns en voortgangsrecords blijven bron van waarheid;
  • SignalR is transport;
  • browsemodus is presentatiestate;
  • meekijken wijzigt geen antwoord, vraagstatus, runstatus of voortgang;
  • daadwerkelijke live-meekijksessie wordt auditbaar vastgelegd waar functioneel vereist.

19.29 Background jobs

Background jobs voeren periodieke of uitgestelde verwerking uit.

Voor background jobs geldt:

  • zij zijn idempotent waar herhalen mogelijk is;
  • zij selecteren op actuele databasecriteria;
  • zij verwerken niet meer dan de functionele scope;
  • zij maken geen onnodige losse jobs per object wanneer periodieke verwerking volstaat;
  • fouten bij één object blokkeren niet noodzakelijk alle andere kandidaten;
  • technische fouten worden gelogd;
  • waar audit nodig is, ontstaat compacte history.

Voorbeeld: verlopen heropentermijnen van meldingen worden periodiek verwerkt en niet via een losse job per melding.

19.30 Systeemcommunicatie

Systeemcommunicatie wordt niet gebruikt als bron van de onderliggende domeinactie.

Een systeembericht kan een gebruiker informeren of naar een object verwijzen, maar opent of verwerkt dat object niet automatisch.

Voorbeelden:

  • relatie-uitnodiging wordt niet geaccepteerd door bericht openen;
  • ticket wordt niet gesloten door bericht openen;
  • oplossing wordt niet geaccepteerd door bericht openen;
  • gedeelde oefening wordt niet gestart door bericht openen;
  • privéthread wordt niet beantwoord door bericht openen.

De vervolgactie blijft onderdeel van het eigen domein.

19.31 Systeemnotificaties

Systeemnotificaties zijn planbare overlays boven frontpages of startcontexten.

Voor systeemnotificaties geldt:

  • frontpage laadt eerst;
  • notificatiecontrole volgt daarna;
  • notificaties blokkeren contextresolutie niet;
  • systeemnotificaties zijn geen mailbox-systeemberichten;
  • systeemnotificaties zijn geen popupregister-popups;
  • AudienceType is geen ContextType;
  • OncePerBrowser gebruikt clientside onderdrukking zonder server-side seen-tabel;
  • tijdens actieve leerling-oefenrun worden overlays niet getoond.

19.32 Popups en feedback

Popups geven actiegerichte feedback, bevestiging, foutafhandeling of invoer.

Voor popups geldt:

  • popupkeys blijven stabiel;
  • popupteksten worden niet per usecase gedupliceerd;
  • popupregister en popup-themes zijn leidend;
  • foutfeedback lekt geen technische payload;
  • autorisatiefouten tonen geen gedeeltelijke data;
  • custom popups blijven codegedreven;
  • beheer wijzigt alleen toegestane velden.

19.33 Leerlingrust tijdens oefenen

Tijdens actieve oefenruns heeft rust voor de leerling prioriteit.

Daarom worden tijdens de actieve oefencontext visueel verborgen of uitgesteld:

  • berichtenbadges;
  • meldingenterugkoppelingen;
  • systeemnotificatie-overlays;
  • actie-indicaties;
  • andere niet-noodzakelijke signalering.

Onderliggende data blijft wel correct opgeslagen.

Na verlaten, onderbreken of afronden van de oefenrun worden relevante signalen opnieuw beoordeeld.

19.34 Geen gedeeltelijke datalekken

Bij autorisatiefouten wordt geen gedeeltelijke data getoond.

Dit geldt nadrukkelijk voor:

  • kindnamen;
  • leerlingnamen;
  • runinhoud;
  • antwoorden;
  • juiste antwoorden;
  • statistieken;
  • payloads;
  • technische snapshots;
  • tokens;
  • stacktraces;
  • interne identifiers;
  • relaties buiten context;
  • meldinginhoud buiten eigenaar/beheercontext;
  • privéberichtinhoud buiten participantcontext.

Een foutmelding mag functioneel duidelijk zijn, maar niet informatief voor ongeautoriseerde verkenning.

19.35 Privacy en anonimisering

Privacygrenzen gelden ook wanneer historische reconstructie nodig is.

Bij anonimisering of accountverwijdering geldt:

  • actuele persoonsgegevens worden verwijderd, vervangen of afgeschermd volgens domeinregels;
  • historische audit blijft zo nodig reconstructief bruikbaar;
  • open relaties worden beëindigd of niet langer autoriserend;
  • actieve toegang, sessies en frontendcontexten vervallen;
  • berichten, tickets, runs en history blijven binnen eigen retentie- en zichtbaarheidregels;
  • exports mogen geen actuele persoonsgegevens terughalen die functioneel geanonimiseerd zijn;
  • beheerweergaven gebruiken geanonimiseerde actor- of gebruikerweergave wanneer actuele persoonsgegevens niet langer nodig zijn.

19.36 Retentie en bewaartermijnen

Retentie is functioneel relevant wanneer zij bepaalt wat gebruikers, beheerders of historische reconstructie later nog mogen zien.

Voor alle domeinen gelden de volgende overkoepelende regels:

RegelBetekenis
Retentie verruimt geen autorisatieEen record dat technisch nog bestaat, mag alleen zichtbaar zijn binnen de actuele rol-, relatie-, participant- of beheercontext.
Cleanup herstelt geen zichtbaarheidVerwijderde mailboxzichtbaarheid, beëindigde relaties of ingetrokken autorisaties worden niet opnieuw zichtbaar door retentie- of cleanupverwerking.
Historie wordt niet blind herschrevenOefenruns, tickets, berichten, audit en shared records blijven waar nodig reconstructief bruikbaar, maar met geanonimiseerde persoonsgegevens waar vereist.
Domeinregels blijven leidendPrivéberichten, systeemberichten, tickets, runs, auditregels en technische snapshots volgen hun eigen functionele retentieregels.
Technische bewaartermijnen horen eldersExacte jobs, SQL, backupretentie, fysieke verwijdering, logrotatie en opslagbeleid horen in TO, SRS of beheerbeleid.

Functionele bewaartermijnen die al in het FO zijn vastgelegd, zoals de bewaartermijn van drie maanden voor privéberichten, blijven leidend totdat zij documentatiebreed worden gewijzigd.

19.37 Identity-providergrens

Authenticatie en credentialbeheer liggen bij de identity provider.

OefenHub beheert:

  • intern applicatieaccount;
  • rollen;
  • profielgegevens;
  • gebruikersinstellingen;
  • applicatiecontext;
  • relaties;
  • domeintoegang;
  • accountlifecycle binnen OefenHub.

OefenHub beheert niet rechtstreeks:

  • wachtwoorden;
  • credential reset;
  • primaire identity-provider-sessies;
  • identity-provider-tokens als functionele domeindata;
  • externe credential lifecycle.

Een geslaagde externe login geeft pas OefenHub-toegang wanneer interne accountcontext geldig is.

19.38 Geen automatische herstelillusie

Voor technische edge cases wordt geen onbetrouwbare automatische herstelroute beloofd.

Voorbeelden:

  • externe login slaagt maar interne provisioning faalt;
  • profiel- of contextinitialisatie is inconsistent;
  • modulepayload kan niet geïnterpreteerd worden;
  • readmodelopbouw faalt;
  • exportgeneratie faalt;
  • realtime verbinding valt weg.

In zulke situaties zijn veilige foutmelding, logging, contactroute, beheeranalyse of technische correctie belangrijker dan schijnbaar automatisch herstel.

19.39 Featuretoggles

Featuretoggles schakelen expliciet togglebare functies aan of uit.

Een featuretoggle:

  • verwijdert geen bestaande domeindata;
  • herschrijft geen geschiedenis;
  • wist geen berichten;
  • verwijdert geen resultaten;
  • maakt geen verborgen autorisatiepad;
  • bepaalt alleen beschikbaarheid van ondersteunde functies;
  • wordt auditbaar gewijzigd.

Verplichte kernfunctionaliteit hoort niet als gewone toggle te worden behandeld.

19.40 Systeeminstellingen

Systeeminstellingen bevatten gecontroleerde configuratiewaarden.

Zij zijn geen vrije sleutel/waarde-opslag voor ongedocumenteerde runtimevariabelen.

Voor systeeminstellingen geldt:

  • sleutelset ontstaat via code/migratie;
  • datatype en invoervorm zijn bekend;
  • beheer wijzigt alleen bestaande ondersteunde instellingen;
  • cache wordt veilig ververst;
  • wijziging is auditbaar;
  • autorisatie- of privacygrenzen worden niet door cache doorbroken.

19.41 Contentbeheer

Contentbeheer beheert tekstuele inhoud op vaste plekken.

Contentbeheer is geen pagebuilder.

Contentbeheer wijzigt niet:

  • layout;
  • routes;
  • componenttypes;
  • autorisatie;
  • tellerdefinities;
  • popupflows;
  • systeemnotificatiegedrag;
  • systeemberichten;
  • featuretoggles;
  • formulierlogica.

Nieuwe pagina- of blokstructuur is een code- en documentatiewijziging.

19.42 Beheerbare templates

Systeemberichttemplates leveren inhoud voor toekomstige concrete systeemberichten.

Een templatewijziging:

  • wijzigt niet automatisch bestaande systeemberichten;
  • maakt geen nieuwe technische referentie aan;
  • verwijdert geen verplichte systeemcommunicatie;
  • mag alleen ondersteunde placeholders gebruiken;
  • is auditbaar;
  • blijft gescheiden van popups, systeemnotificaties en privéberichten.

19.43 Lege toestanden

Lege toestanden zijn normale toestanden.

Voorbeelden:

  • geen toegankelijke oefeningen;
  • geen recente resultaten;
  • geen hervatbare run;
  • geen gekoppelde leerlingen;
  • geen gekoppelde kinderen;
  • geen berichten;
  • geen meldingen;
  • geen actieve systeemnotificaties;
  • geen zoekresultaten;
  • geen modulemigratiekandidaten;
  • geen recente beheerwijzigingen.

Een lege toestand is geen autorisatiefout wanneer de gebruiker de pagina wel mag openen.

19.44 Fouttoestanden

Fouttoestanden ontstaan wanneer context, object, status, autorisatie, validatie of techniek niet voldoet.

Voor fouttoestanden geldt:

  • geen gedeeltelijke data tonen;
  • geen technische details lekken;
  • geen ongeautoriseerde context herstellen;
  • geen clientstate vertrouwen;
  • geen stille datamutatie uitvoeren;
  • geen half afgeronde transactie achterlaten;
  • fout auditbaar of technisch logbaar maken waar nodig;
  • passende popupkey of inline foutstatus gebruiken zonder tekstduplicatie.

19.45 Bronconflicten

Wanneer bronnen elkaar tegenspreken, geldt de bronhiërarchie uit FO-00.

Als de bronhiërarchie geen eenduidige oplossing geeft, wordt het punt niet lokaal opgelost.

Dan geldt:

  • conflict expliciet benoemen;
  • geen stille keuze introduceren;
  • open punt opnemen in FO-20 of relevante bron;
  • geen dubbele waarheid creëren;
  • pas na besluit registers, usecases, FO en schermdocumentatie in lijn brengen.

19.46 Beslisregels per functioneel domein

DomeinOverkoepelende beslisregel
Account en profielIdentity provider is bronhoudend voor credentials; OefenHub beheert applicatiecontext.
Rollen en autorisatieServer-side context is leidend; zichtbare UI is geen bewijs.
RelatiesActieve relatiecontext bepaalt relationele toegang; historie wordt niet herschreven.
FrontpagesRead-only oriëntatiepagina’s; geen diepe mutaties zonder objectselectie.
OefencatalogusCentrale categorie-identiteit en concrete oefeningconfiguratie blijven gescheiden.
OefenmodulesModulepayload bevat moduleKey en schemaVersion; geen dubbele generieke schema-kolom.
LeerlingrunsExerciseRun en voortgangsrecords zijn bron voor oefenen, resultaten en live meekijken.
Resultaten en PDFResultaatpresentatie en PDF-export zijn read-only op historische runcontext.
Gedeelde oefeningenShared record is administratief; ontvanger krijgt pas bij start een eigen run.
DocentfunctionaliteitDocentcontext begrenst leerlingen, autorisaties, resultaten en live meekijken.
Ouder/voogdActieve GuardianStudent-relatie is voortdurende autorisatiebron.
BeheerderfunctionaliteitBeheerder heeft beheercontext, geen vrije eindgebruikersbypass.
BerichtenMailboxweergave is readmodel; berichten en threads blijven eigen domeinrecords.
MeldingenTickets hebben eigen lifecycle; systeemcommunicatie verwerkt geen ticketactie automatisch.
Live meekijkenRead-only; realtime transport is geen bron van waarheid.
ContentbeheerTekstueel beheer op vaste plekken, geen pagebuilder.
Popups en notificatiesPopup, systeemnotificatie en mailbox-systeembericht zijn verschillende mechanismen.

19.47 Relatie tot andere FO-hoofdstukken

HoofdstukRelatie
Bronnen en afbakeningBepaalt bronhiërarchie, DRY, linkbeleid en conflictregels.
Productvisie en scopeGeeft productkader en initiële scope-afbakening.
Rollen, context en autorisatieWerkt rol- en contextregels inhoudelijk uit.
Applicatieschil, header, footer en navigatiePast UI- en navigatiegrenzen toe rond zichtbaarheid, badges en anti-afleiding.
Frontpages en overzichtsschermenPast read-only en tellerregels toe op frontpages.
Account, profiel en voorkeurenPast identity-providergrens, profielcontext en instellingen toe.
RelatiebeheerPast relatiecontext en historische grenzen toe.
Oefencatalogus, niveaus, categorieën en oefeningenPast categorie-, niveau- en oefeninggrenzen toe.
Leerling: oefenen, voortgang en resultatenPast run-lifecycle, voortgang en resultaatregels toe.
Gedeelde oefeningenPast shared-record en historische snapshotregels toe.
DocentfunctionaliteitPast docentcontext, niveauautorisatie en samenwerking toe.
Ouder-/voogdfunctionaliteitPast ouder-/voogdrelatie en read-only grenzen toe.
BeheerderfunctionaliteitPast beheercontext, audit en geen-bypassregels toe.
Berichten, communicatie en notificatiesPast communicatiescheiding, readstates en realtimegrenzen toe.
Meldingen en ticketafhandelingPast statusmodel, discussie, closures, reopen en TickerQ-regels toe.
Live meekijkenPast realtime, audit en read-only meekijkregels toe.
Contentbeheer, vaste pagina’s en footerPast contentbeheer- en pagebuildergrenzen toe.
Popups, templates, features en systeemnotificatiesPast popup-, template-, feature- en notificatiegrenzen toe.
PDF-export en resultaatpresentatiePast historische resultaat- en exportregels toe.
Open punten en buiten scopeCentraliseert onbesliste keuzes en buiten-scopeafbakening.
Schermlaag en UX-specificatiesPast schermlaag-, UX-, lege-toestand- en foutregels toe.
Oefenmodules en modulepayloadsPast modulecontract, payloadlagen en schema-evolutie toe.
Functionele architectuurcontextVerbindt deze regels met systeemgrens, containers en infrastructuur.

19.48 Gerelateerde bronverwijzingen

BronLink
Technisch Ontwerp — applicatielagenApplicatielagen, projectstructuur en dependency-richting
Technisch Ontwerp — autorisatieAutorisatie, policies en server-side contextcontrole
Technisch Ontwerp — logging en foutafhandelingLogging, audit, securitylogging en technische foutafhandeling
Technisch Ontwerp — privacyPrivacy, retentie, anonimisering en gegevensbescherming
Ontwerpbron — business rulesBusiness rules
Ontwerpbron — autorisatiematrixAutorisatiematrix
Ontwerpbron — statusmodellenStatusmodellen
Ontwerpbron — command-registerCommand-register
Ontwerpbron — event-registerEvent-register
Ontwerpbron — popup-registerPopup-register
Database-informatie — audit, historie en technische uitgangspuntenAudit, historie en technische uitgangspunten
Database-informatie — oefenruns, delen en voortgangOefenruns, delen en voortgang
Architectuur — niveau 2 container diagramContainerdiagram
Architectuur — niveau 3 componentdiagramComponentdiagram
FO — bronnen en afbakeningBronnen en afbakening
FO — functionele architectuurcontextFunctionele architectuurcontext
FO — open punten en buiten scopeOpen punten en buiten scope