e-naxosMAF COURSE / COURS
English

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

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 $refusal
dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $refusal maybe
dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- status $refusal
dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $refusal reject
dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $refusal reject
dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $refusal approve
dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- status $refusal

maybe 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 $approved
dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $approved approve "External business decision." --fail-after-write
dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- status $approved
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 -- resume $approved approve "External business decision."
dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- status $approved

La 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-restore

Indices 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.

Comprendre la coordination

Prérequis

Pour poursuivre

lot014-consolidation-1 · 2026-10-24 · 9a895c94534cd5fc6f3da883e37e5f7856e588c1