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:
Claude committed 2026-10-16 04:01:03 +00:00
1 parent 1d33ca5a49
commit 76d9dce74a
12 files changed
+1119 -21

No files matched your search

@@ -0,0 +1,77 @@
# Lot 38 — L'outil criteria du mode Code dans la façade
## Contexte
En mode Code, le modèle tient les critères d'acceptation de sa tâche avec
l'outil `criteria` :
- les poser ;
- les marquer faits ;
- les lister ;
- les effacer.
La passe de vérification les marque ensuite `passed` ou `failed`.
Depuis le lot 19, la façade sert déjà les critères de l'écran
(`/api/chat/criteria`, `chat/crit:<id>` scellés). La passe de vérification
les relit depuis le lot 7. Mais l'outil lui-même partait au Go
(`/internal/v1/tool/exec`), qui le renvoyait à la façade comme delta
(`critNotify` → `/internal/facade/v1/delta`).
## Le lot
`chat/crittool.rs` porte `toolCriteria`, mêmes messages au caractère près :
- **list** : action vide ou d'un autre type comprise ;
- **add** :
- textes vides ou d'un autre type ignorés ;
- ids repris après le plus grand ;
- vingt critères au plus ;
- **set** :
- id numérique (tronqué) ou en chaîne (« "2" », « "#2" », « +1 ») ;
- statut libre, note rognée ;
- `passed` refusé hors de la passe de vérification ;
- **clear**.
Les règles de rangement et d'affichage :
- une liste vide supprime la clé ; une erreur d'écriture est ignorée, comme
dans le Go ;
- une liste rangée illisible vaut « aucun critère » ;
- la note vide n'est pas écrite (`omitempty`).
`GoTurnHost::exec_tool` l'exécute pour la discussion du tour
(`main_conv`). La passe de vérification (`Role` = verifier) est la seule à
pouvoir marquer `passed`. Chaque changement pousse la liste à l'écran (delta
`criteria` + `ts`) par un nouveau champ `deltas` de l'hôte :
- le journal de la discussion pour un tour ;
- celui de la conversation pour une passe de vérification.
Écart assumé : le Go rangeait les critères sous la discussion **active**
au moment de l'appel (`convEnsureActive`). La façade les range sous celle du
tour. Elles ne diffèrent que si l'utilisateur change de discussion pendant
la génération, et c'est alors la façade qui a raison.
`see_image` reste au Go. Il redresse et réduit l'image (EXIF, taille) avant
de l'encoder, ce qu'un port ne rendrait pas octet pour octet.
## Parité
`internal/loki/parity_criteria_test.go` tire du Go un journal de 22 appels
(`tests/parity_tools/criteria.json`). Chaque étape porte :
- les arguments, builder ou vérification ;
- le résultat ;
- les critères rangés ensuite.
`tests/tools.rs` (`criteria_comme_le_go`) le rejoue contre le port. Il
vérifie aussi :
- le rangement scellé ;
- la liste poussée à l'écran à chaque changement, et seulement alors.
`tests/lot6.rs` (`contrat_verifie_par_la_facade`) fait tourner un vrai
contrat. La passe de vérification marque le critère `passed` dans la
façade : rien ne passe par le Go, le critère est rangé scellé, l'écran
reçoit la liste.