Une clé a été jetée parce qu’une porte coinçaitUn échec récupérable traité comme une révocation définitiveA key was binned because one door stuckA recoverable failure treated as a permanent revocation
Une clé de garde-manger n’a pas tourné un soir et quelqu’un l’a jetée. La porte résistait peut-être seulement pour la nuit. Le lendemain, personne ne pouvait entrer sans redemander une clé au propriétaire.Donner, rafraîchir, remplacer et supprimer un identifiant sont quatre transitions d’état distinctes, chacune rattachée à un propriétaire. Sur Goose, un chemin de récupération destructif traitait un échec temporaire de rafraîchissement OAuth comme une révocation définitive et effaçait les identifiants stockés.A pantry key would not turn one evening, so someone threw it away. The door may only have been stiff for the night. By morning, nobody could enter without asking the owner for another key.Issuing, refreshing, replacing and deleting a credential are four distinct state transitions, each bound to an owner. In Goose, a destructive recovery path treated a transient OAuth refresh failure as a permanent revocation and wiped the stored credentials.
Les clés et les portesSécurité, confiance et confidentialitéKeys and doorsSecurity, trust and privacyUne clé neuve pouvait disparaître du tiroir communSignauxA fresh key could vanish from the shared drawerSignals
Une seule mauvaise soirée pouvait vider le tiroir d’une clé encore bonne. Plusieurs mains y prenaient et remettaient des clés sans laisser de nom. La main revenue trop tard pouvait jeter la clé neuve qu’une autre venait de poser.Une panne réseau ou serveur transitoire produit le même effet qu’un rejet explicite du serveur d’autorisation. Le stockage d’identifiants est partagé entre processus concurrents, sans comparaison de génération avant suppression. Avec des jetons de rafraîchissement rotatifs, un processus obsolète efface les identifiants qu’un autre vient d’écrire, et la reprise exige alors une nouvelle autorisation interactive.One bad evening could empty the drawer of a key still good. Several hands took keys out and put them back without signing. The late hand could bin the fresh key another hand had just placed there.A transient network or server fault produces the same outcome as an explicit rejection from the authorization server. Credential storage is shared across concurrent processes with no generation comparison before deletion. With rotating refresh tokens a stale process erases credentials another has just written, and recovery then demands fresh interactive authorization.
Une porte fermée ne disait pas si la clé était perdueMécanismeA shut door did not say whether the key was lostMechanism
Devant une porte fermée, on ne savait pas si le refus était pour toujours ou seulement ce soir. Jeter la clé répondait aux deux cas par le même geste, sans retour. Sans nom sur les clés du tiroir, on pouvait aussi jeter la plus récente.La sémantique de reprise et la propriété de l’état sont indissociables dès que la récupération modifie un identifiant. Rien ne distingue, au point de décision, une panne temporaire d’un rejet définitif, alors que les deux appellent des transitions opposées. En concurrence, un nettoyage qui supprime sans comparer la génération de jeton détruit une écriture plus récente que la sienne.At a shut door, nobody knew whether the refusal was forever or only for that night. Throwing away the key answered both with one irreversible move. With no names on the drawer keys, it could also discard the newest one.Retry semantics and state ownership cannot be separated once recovery mutates a credential. At the decision point nothing separates a temporary fault from a definitive rejection, although the two call for opposite transitions. Under concurrency, cleanup that deletes without comparing token generation destroys a write newer than its own.
Garder la clé jusqu’au refus certainRéponseKeep the key until refusal is certainResponse
Cherchez d’abord pourquoi la porte a résisté. Gardez la clé tant qu’un retour est possible, et ne la jetez qu’après un refus net du propriétaire. Vérifiez aussi que la clé du tiroir est bien celle que vous aviez prise ; le signalement reste ouvert et aucune réparation livrée n’est établie.Classer l’échec de rafraîchissement avant toute mutation de l’état persistant. Conserver les identifiants sur panne récupérable, ne les effacer qu’après un rejet définitif, et lier chaque suppression destructive à la génération de jeton qui a déclenché le rafraîchissement. Sur Goose, le signalement reste ouvert avec une reproduction décrite ; aucune correction fusionnée, livrée ou vérifiée sur le terrain n’est établie.First ask why the door held. Keep the key while a return is possible, and bin it only after the owner plainly refuses. Check that the drawer key is the one you took; the report remains open and no delivered repair is established.Classify the refresh failure before mutating any persistent state. Retain credentials on recoverable faults, delete only after a definitive rejection, and bind every destructive cleanup to the token generation that started the refresh. The Goose report remains open with a described reproduction; no merged, shipped or field-verified fix is established.
Une gêne d’un soir ne doit pas coûter la clé du lendemainLeçonOne bad night must not cost tomorrow’s keyLesson
Une porte qui coince peut redevenir accessible. Elle ne doit donc pas faire jeter la clé du prochain service. Tout geste sans retour attend un refus établi et la certitude de tenir la bonne clé.Une erreur récupérable ne doit pas pouvoir déclencher une transition d’état irréversible. Toute suppression destructive exige à la fois une classification de l’échec et une preuve de propriété sur la valeur supprimée.A stuck door may open again. It must not cost the next service its key. Any move without return waits for an established refusal and certainty that it holds the right key.A recoverable error must never be able to trigger an irreversible state transition. Any destructive deletion requires both a classification of the failure and proof of ownership over the value being removed.

