MotifPattern

Au passe — La clé jetée parce qu’elle a coincéUn échec d’authentification récupérable déclenchait la suppression définitive des identifiantsAt the pass — One stiff lock, and the key is goneA recoverable authentication failure triggered permanent deletion of the credentials

Au service, la clé du garde-manger n’a pas tourné du premier coup. Au lieu de réessayer plus tard, la maison l’a jetée pour de bon. La porte n’avait résisté qu’un instant ; rentrer demande maintenant de reprendre toute la démarche d’origine.Un signalement sur l’intégration OAuth de goose décrit un chemin de récupération destructif : un échec temporaire de rafraîchissement est traité comme une révocation définitive, et les identifiants stockés sont effacés. Une erreur récupérable ne doit pas conserver la même sortie qu’un rejet définitif. Avec un stockage partagé et des jetons de rafraîchissement rotatifs, un processus obsolète peut en outre effacer les identifiants qu’un autre vient de renouveler.During service, the pantry key did not turn on the first try. Instead of coming back to it later, the house threw it away for good. The door had only stuck for a moment; getting in again now means starting the whole request from the beginning.A report on the goose OAuth integration describes a destructive recovery path: a temporary refresh failure is handled as a definitive revocation, and the stored credentials are erased. A retryable error must not share the exit taken by a final rejection. With shared storage and rotating refresh tokens, a stale process can also erase credentials another process has just renewed.

La cuisson et les reprisesExécution, arrêt et récupérationCooking and restartingExecution, cancellation and recovery

Au passe — Deux cuisiniers, un trousseau, une clé jetéeSignauxAt the pass — Two cooks share a keyring, one key vanishesSignals

Au service, Personne n’a retiré le droit d’entrée, et pourtant on redemande tout depuis zéro. La porte avait seulement résisté, le temps d’une panne. Et quand deux cuisiniers partagent le même trousseau, celui qui rentre en retard jette la clé neuve du premier.Le signal est la perte d’identifiants après une panne temporaire de réseau ou de serveur, alors qu’aucune révocation n’a eu lieu. Une réautorisation interactive redevient nécessaire sans changement d’autorisation côté fournisseur. En concurrence, un second signal apparaît : le processus perdant la course de rotation efface la génération de jeton plus récente écrite par le gagnant.During service, Nobody took the right of entry away, yet the whole request has to be made from scratch. The door had merely stiffened while something was down. And where two cooks share one keyring, the late one throws out the fresh key the first just had cut.The signal is credential loss after a transient network or server failure, with no revocation on the provider side. Interactive reauthorisation becomes necessary again although the grant never changed. Under concurrency a second signal appears: the process that loses the rotation race erases the newer token generation written by the winner.

Au passe — On jette la clé quand attendre aurait suffiMécanismeAt the pass — Waiting would have done; the key was thrown awayMechanism

Au service, De l’extérieur, une porte qui a durci et un droit retiré donnent la même impression. Rien ne tourne, ni d’un côté ni de l’autre. La maison a choisi le geste qu’on ne peut plus défaire, alors que l’attente aurait suffi.Sémantique de reprise et propriété de l’état deviennent indissociables dès lors que la récupération modifie des identifiants. Le chemin ne classait pas l’échec : panne temporaire et rejet explicite produisaient la même transition, irréversible. En concurrence, le nettoyage destructif exige en plus une comparaison avant suppression, faute de quoi une tentative ancienne efface une génération plus récente.During service, From outside, a door that has stiffened and a right that was taken away come to the same thing. Nothing turns either way. The house reached for the move nobody can undo, when waiting would have done.Retry semantics and state ownership become inseparable the moment recovery mutates credentials. The path did not classify the failure: a transient outage and an explicit rejection produced the same irreversible transition. Under concurrency, destructive cleanup further requires a compare-before-delete, or an older attempt erases a newer generation.

Au passe — Attendre après une panne, jeter après un refusRéponseAt the pass — Wait out a breakdown, throw away after refusalResponse

Au service, regarde d’abord ce qui bloque : une porte durcie se réessaie, un droit retiré se redemande. Ne jette la clé qu’après un refus net, jamais après une panne, et seulement si elle est bien la tienne. Cette conduite est proposée ; rien ne dit qu’elle soit en place.Classer les échecs de rafraîchissement avant de modifier l’état persistant. Conserver les identifiants lors des pannes récupérables et ne les effacer qu’après un rejet définitif. Lier tout nettoyage destructif à la génération de jeton ayant lancé le rafraîchissement, et garder les erreurs de lecture du stockage comme erreurs diagnostiques plutôt que comme un état jamais autorisé. Le signalement est ouvert et décrit une reproduction ainsi qu’une correction proposée ; les éléments examinés n’établissent aucune correction fusionnée ou livrée.During service, start with what is blocking: a door that stiffened deserves another try, and a right withdrawn deserves a fresh request. Throw the key away only after a flat refusal, never after an outage, and only if it is yours. This practice is proposed; nothing shows it in place.Classify refresh failures before mutating persistent state. Preserve credentials on recoverable outages and erase them only after a definitive rejection. Bind every destructive cleanup to the token generation that initiated the refresh, and keep storage read errors as diagnostic errors rather than evidence of a grant that never existed. The report is open and describes a reproduction and a proposed fix; the material examined establishes no merged or shipped correction.

Au passe — Rien d’irréversible sans un refus netLeçonAt the pass — A setback must never trigger what cannot be undoneLesson

Au service, Un contretemps ne doit jamais pouvoir déclencher un geste qu’on ne peut plus défaire. Devant une porte qui résiste, on attend ; on ne jette pas la clé.Une erreur récupérable ne doit pas pouvoir déclencher une transition d’état irréversible. La classe d’erreur est la précondition du nettoyage destructif, pas un détail de journalisation.During service, A setback must never be able to set off a move nobody can undo. At a door that sticks you wait; you do not throw the key away.A retryable error must not be able to trigger an irreversible state transition. The error class is the precondition for destructive cleanup, not a logging detail.