mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-23 06:58:14 +02:00
Lot 38 : l'outil criteria du mode Code exécuté par la façade
L'outil par lequel le modèle tient les critères d'acceptation de sa tâche (poser, marquer faits, lister, effacer) partait au Go, qui renvoyait la liste à la façade comme delta. Il s'exécute maintenant dans le tour de la façade (chat/crittool.rs, port de toolCriteria) : mêmes messages, ids en nombre ou en chaîne, vingt critères au plus, `passed` réservé à la passe de vérification, rangement scellé (chat/crit:<id>), liste poussée à l'écran à chaque changement par un nouveau champ `deltas` de l'hôte du tour. Les critères sont rangés sous la discussion du tour (le Go prenait la discussion active : elles ne diffèrent que si l'utilisateur en change pendant la génération). see_image reste au Go (préparation de l'image). Parité : journal de 22 appels tiré du Go (parity_criteria_test.go → tests/parity_tools/criteria.json), rejoué par tests/tools.rs ; le contrat du mode Code de tests/lot6.rs est désormais vérifié par la façade seule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
This commit is contained in:
12 files changed
+1119
-21
No files matched your search
@@ -67,3 +67,53 @@ async fn le_reste_va_au_go() {
|
||||
let args = a(json!({"pattern":"*"}));
|
||||
assert!(exec_local(&st, false, "glob", &args, "*").await.is_some());
|
||||
}
|
||||
|
||||
/// Lot 38 : l'outil criteria du mode Code, rejoué contre le journal du Go
|
||||
/// (`internal/loki/parity_criteria_test.go` → `parity_tools/criteria.json`) :
|
||||
/// résultat de chaque appel, critères rangés après coup (scellés), et la
|
||||
/// liste poussée à l'écran quand elle change.
|
||||
#[tokio::test]
|
||||
async fn criteria_comme_le_go() {
|
||||
use loki_rs::chat::crittool::{CRIT_MAX_COUNT, exec};
|
||||
let fx: Value =
|
||||
serde_json::from_str(include_str!("parity_tools/criteria.json")).expect("journal");
|
||||
let t = tempfile::tempdir().unwrap();
|
||||
let (_f, go, _stop) = common::fakego::start(t.path().into()).await;
|
||||
let backend = go.backend.lock().unwrap().unwrap();
|
||||
let store = loki_rs::store::Store::new(backend, common::fakego::JETON.into());
|
||||
assert_eq!(CRIT_MAX_COUNT, 20);
|
||||
let conv = "c1";
|
||||
for st in fx.as_array().unwrap() {
|
||||
let name = st["name"].as_str().unwrap();
|
||||
if let Some(put) = st["put"].as_str() {
|
||||
store
|
||||
.put_seal("chat", &format!("crit:{conv}"), put.as_bytes().to_vec())
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
let args = st["args"].as_object().cloned().unwrap_or_default();
|
||||
let verifier = st["verifier"].as_bool() == Some(true);
|
||||
let before = store.get_open("chat", &format!("crit:{conv}")).await.unwrap();
|
||||
let out = exec(&store, conv, &args, verifier).await;
|
||||
assert_eq!(out.result, st["out"].as_str().unwrap(), "{name}");
|
||||
let raw = store.get_open("chat", &format!("crit:{conv}")).await.unwrap();
|
||||
let stored = raw
|
||||
.as_deref()
|
||||
.filter(|b| !b.is_empty())
|
||||
.map(|b| serde_json::from_slice::<Value>(b).unwrap())
|
||||
.unwrap_or(Value::Null);
|
||||
assert_eq!(stored, st["stored"], "{name}");
|
||||
// Scellés comme le contenu des discussions.
|
||||
if let Some(sealed) = go.get("chat", &format!("crit:{conv}")) {
|
||||
assert!(sealed.starts_with("SCELLE:"), "{name} : {sealed}");
|
||||
}
|
||||
// L'écran reçoit la liste quand elle change (vide : effacée).
|
||||
match &out.notify {
|
||||
Some(list) => {
|
||||
let want = if stored.is_null() { json!([]) } else { stored.clone() };
|
||||
assert_eq!(json!(list), want, "{name}");
|
||||
}
|
||||
None => assert_eq!(raw, before, "{name} : rien ne change sans notification"),
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user