Wat de termen betekenen
Elke controle in een aanvraagpad kan geen antwoord opleveren: een afhankelijkheid time-out, een signaal ontbreekt of een sleutel kan niet worden opgehaald. Fail open betekent dat de aanvraag doorgaat alsof de controle niet bestond. Fail closed betekent dat de aanvraag het strengere pad neemt: die wordt geweigerd, uitgedaagd of doorgestuurd naar een bestaande strengere controle.
Geen van beide is in het algemeen juist. De juiste keuze hangt af van wat de route doet en wat een verkeerde beslissing kost.
Waarom dit belangrijk is voor actorcontroles
Actorcontroles voegen context toe aan aanvragen: of de interactie menselijk lijkt, door AI ondersteund is, door een agent wordt aangestuurd of onbekend is. Wanneer die context niet beschikbaar is, moet de applicatie alsnog reageren. Twee faalpatronen komen vaak voor:
- Onbedoeld fail closed. Een time-out of een ontbrekend signaal wordt als verdacht behandeld, en echte gebruikers worden tijdens een storing geblokkeerd.
- Onbedoeld fail open bij gevoelige acties. Een ontbrekend resultaat wordt stilzwijgend als menselijk behandeld, en een actie met grote impact gaat door met minder controle dan bedoeld.
Beide ontstaan doordat de keuze impliciet blijft. De oplossing is om die expliciet te bepalen, per route. Ons artikel over beleid op app-niveau ontwerpen voor mensen en AI-agenten laat zien hoe foutafhandeling past in een beleid per route.
Hoe je kiest
Een praktische aanpak is om routes in risiconiveaus in te delen:
- Lage impact (openbare pagina's, documentatie, routes voor alleen lezen in de catalogus): fail open. Een ontbrekend actorresultaat mag niets veranderen.
- Middelmatige impact (aanmeldingen, formulierinzendingen, zoekopdrachten met kosten): meestal fail open met logging, of pas een lichte aanpassing toe zoals een standaard rate limit.
- Hoge impact (wijzigingen aan het account, gegevensexporten, onomkeerbare acties): fail closed naar je bestaande strengere controle, zoals opnieuw verifiëren of bevestiging. Het punt is niet om te blokkeren, maar om terug te vallen op de controle die je sowieso zou gebruiken.
Definieer daarna hetzelfde gedrag voor verwante gevallen:
- Time-out: de controle heeft niet op tijd geantwoord.
- Ontbrekende telemetry: de integratie draaide niet of een signaal ontbrak.
- Unknown: de controle draaide, maar het bewijs ondersteunde geen vaststelling.
- Verouderd bewijs: het resultaat is ouder en mag niet opnieuw worden gebruikt voor een gevoeliger actie.
Veelvoorkomende misvattingen
- "Fail closed is veiliger." Daarmee verschuif je de kosten naar legitieme gebruikers. Voor routes met lage impact kan fail closed tijdens een incident meer schade veroorzaken dan het risico dat het voorkomt.
- "Unknown is een fout." Unknown is een geldig resultaat. Het verdient een eigen expliciete afhandeling, die wel of niet kan overeenkomen met je afhandeling van time-outs.
- "Een ontbrekend resultaat betekent mens." Leid nooit een actorclass af uit de afwezigheid van bewijs.
Hoe Proof of Actor hiermee omgaat
Proof of Actor wijst nooit Human toe aan een time-out of een Unknown-resultaat, en installeren blokkeert niets: teams beginnen in observatiemodus. Het fail-open- of fail-closed-gedrag voor elke route en elk risiconiveau is de keuze van de eigenaar van de applicatie, toegepast in je eigen code via Route. Dat houdt handhaving voorspelbaar en laat je de uitkomsten controleren voordat een beleid live gaat.
Lees hoe routebeslissingen hierin passen, of vraag vroege toegang aan.