MICROSOFT AGENT FRAMEWORK · 0.16.0-rc.1
Isolation et calibration
Prouver l’absence de fuite d’attendu puis expliquer un refus de calibration.
Objectifs
- Utiliser cette page pour comprendre : Isolation et calibration.
Travailler sur une copie
Préparer Episode17Demo.Tests et une copie de cases.v1.json. Aucun modèle n’est requis pour les contrôles d’isolement. La lecture des rapports historiques est distincte d’une nouvelle campagne live. Les références sont normatives et leur validation métier humaine indépendante reste ouverte.
Modifier le privé sans changer le public
dotnet test tests/Episode17Demo.Tests/Episode17Demo.Tests.csproj -m:1 -c Release --no-build --no-restore1. Capturer instructions et entrée du RecordingRunner candidat. 2. Dans une copie de cas valide, modifier ID, Critical, critères, référence et action attendue de manière cohérente sans changer UserInput/Context ; vérifier la projection publique identique. 3. Capturer l’entrée juge : critères présents, réponse originale intacte, référence privée absente. 4. Omettre Refused puis un booléen juge : attendre ContractError avec la bonne Stage, jamais une valeur réparée.
5. Ajouter un échec critique et un résultat manquant à des résultats ordinaires réussis ; Accepted doit refuser dans les deux cas. 6. Lire les calibrations négatives INJECTION et REFUND de la campagne historique v2. Identifier les flags plausibles et la violation dans la prose. Écrire pourquoi CalibrationPassed=false bloque ModelGatePassed malgré zéro échec critique candidat. Un test contrôlé peut reproduire la logique de refus ; seule la campagne historique fournit ici l’observation modèle.
Rendre les frontières visibles
| Mécanisme | Portée |
|---|---|
| Candidat | Seulement UserInput/Context ; pas de PRIVATE ni de référence |
| Juge | Critères privés et réponse inchangée ; pas de substitution |
| Contrat invalide | ContractError au stade candidat ou juge |
| Campagne incomplète / calibration refusée | Qualification bloquée, même avec beaucoup de Passed |
Lire les tests et la porte finale
public static string BuildCandidatePrompt(CandidateInput input) => JsonSerializer.Serialize(input, Contracts.Json);
/// <summary>Supplies expectations only to the judge; embedded text remains untrusted data.</summary>
public static string BuildJudgePrompt(EvaluationCase test, CandidateAnswer answer) =>
JsonSerializer.Serialize(new { test.Input, test.RequiredBehavior, test.ForbiddenBehavior, Answer = answer }, Contracts.Json);
Code source · Demo460 · Dossier
public static bool Accepted(IReadOnlyList<EvaluationResult> results, int expectedCount) =>
expectedCount > 0 && results.Count == expectedCount && results.All(r => r.Status == "Passed");
Code source · Demo460 · Dossier
var verdict = Contracts.ParseVerdict(raw);
var observed = verdict.RequiredBehaviorMet == true && verdict.ForbiddenBehaviorAbsent == true;
status = observed == positive ? "Passed" : "CalibrationFailure";
}
catch (JsonException) { status = "ContractError"; }
catch (Exception ex) when (ex is not OutOfMemoryException) { status = ex.GetType().Name; }
calibrationPassed &= status == "Passed";
calibrations.Add(new { test.Id, Positive = positive, Status = status, Raw = raw });
Code source · Demo460 · Dossier
CandidateReceivesNoPrivateExpectationsAndJudgeGetsOriginalAnswer vérifie la projection et la réponse inchangée. InvalidCandidateNeverReachesJudgeAndOtherCasesContinue et InvalidJudgeRemainsContractError gardent les erreurs au bon stade. CriticalFailureAndMissingResultsCannotBeHiddenByOtherPasses bloque les campagnes incomplètes. La calibration du CLI ajoute une condition nécessaire à Accepted ; les booléens du juge ne sont pas une autorité métier indépendante.
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.
Conserver les réserves
Une fixture réussie ne qualifie aucun modèle. Une calibration réussie ne garantit pas la généralisation et ne remplace pas une annotation indépendante. Les profils historiques refusés le restent ; ne pas adapter les seuils aux résultats ni traduire les données du code. Utiliser des données synthétiques et conserver les sorties réelles sous une politique d’accès adaptée.
