MICROSOFT AGENT FRAMEWORK · 0.16.0-rc.1
Refus, redémarrage et rejeu
Observer un refus final et un rejeu après échec post-commit, avec lecture indépendante de SQLite.
Objectifs
- Utiliser cette page pour comprendre : Refus, redémarrage et rejeu.
Deux opérations isolées
Utiliser deux répertoires neufs dans une distribution complète compilée en Release. Aucun modèle. Garder checkpoints, waiting.json et business.db ensemble. Chaque commande ci-dessous relance le programme : le processus start est terminé avant resume.
Refuser puis tenter de changer la décision
$refusal = Join-Path $env:TEMP ('maf-refusal-' + [guid]::NewGuid().ToString('N'))dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- start $refusaldotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $refusal maybedotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- status $refusaldotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $refusal rejectdotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $refusal rejectdotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $refusal approvedotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- status $refusalmaybe doit échouer sans quitter Waiting ; reject donne Rejected, son rejeu identique réussit et approve contradictoire échoue. Relever les codes de sortie immédiatement avec $LASTEXITCODE. Le nombre de lignes ApprovedBacklogItems reste zéro.
Interrompre après une vraie écriture
$approved = Join-Path $env:TEMP ('maf-approved-' + [guid]::NewGuid().ToString('N'))dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- start $approveddotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $approved approve "External business decision." --fail-after-writedotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- status $approveddotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $approved approve "External business decision."dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $approved approve "External business decision."dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- status $approvedLa panne injectée retourne 1 mais status lit déjà Completed, ItemId et StoredItem. Les deux reprises suivantes doivent garder le même ItemId. Dans les traces de resume, attendre ApplyApprovalV1 et l’absence de PrepareApprovalV1. Comparer Responding au RequestId de waiting.json. Conserver les traces et les bases pour l’inspection.
Vérifier des lignes, pas des promesses
Avec un lecteur SQLite, exécuter SELECT OperationId, COUNT(*) FROM ApprovedBacklogItems GROUP BY OperationId; puis SELECT OperationId, Status, Decision FROM Approvals;. Pour l’opération approuvée : un groupe de une ligne, Completed et la décision initiale. Pour le refus : aucune ligne métier et Rejected. Le contenu de StoredItem doit être la proposition « Regional pilot ». Les tests ci-dessous vérifient aussi rollback, clé liée à un autre brouillon, mauvaise corrélation et appels concurrents au store.
dotnet test tests/Maf.Durable.Tests/Maf.Durable.Tests.csproj -m:1 -c Release --no-build --no-restoreIndices de vérification
Avant la correction, consigner la prédiction et le résultat observé. Distinguer texte généré, statut terminal, décision et état persistant. En cas d’écart, suivre le fichier et le test nommés dans la procédure ; ne pas supprimer le garde-fou pour obtenir le résultat attendu.
Interpréter la preuve
Le contrôle local de ce lot rejoue ces scénarios dans des processus distincts et lit SQLite directement. L’arrêt testé est une exception injectée après commit, pas une coupure électrique. Les identifiants de requête restent stables au sein de la même opération ; ils diffèrent entre opérations neuves. Ne pas supprimer le reçu après achèvement : l’exercice rejoue intentionnellement un ancien checkpoint. Aucune transaction distribuée ni validation humaine indépendante n’est démontrée.
