Toute fonction indicatrice sur un domaine fini discret peut etre encodee comme une instance SAT en temps polynomial. Le bucketing par arbre de decision reduit a un temps lineaire.
Snake ne resout pas SAT — il construit des formules structurees ou les donnees sont l'assignation. La NP-durete de SAT s'applique a la recherche d'assignations pour des formules arbitraires. Snake ne fait jamais ca.
Le controleur doit classifier chaque interaction dans l'une des 7 taches :
| Tache | Precision | Recall | F1 | AUROC |
|---|---|---|---|---|
| controle_facture | 0.625 | 0.500 | 0.556 | 0.747 |
| classification_email | 0.529 | 0.450 | 0.487 | 0.680 |
| demande_devis | 0.375 | 0.450 | 0.409 | 0.719 |
| reclamation_client | 0.765 | 0.650 | 0.703 | 0.826 |
| scoring_prospect | 0.529 | 0.450 | 0.487 | 0.659 |
| benchmark_offre | 0.409 | 0.450 | 0.429 | 0.721 |
| negociation_offre | 0.296 | 0.400 | 0.340 | 0.730 |
47.9% accuracy sur 7 classes. Random = 14.3%. Le modele est 3.3× random.
Une facture par email et un devis par email partagent la plupart des features : canal=email, has_montant=1, ton=formel, has_produit_mention=1. Les features discriminantes sont rares :
facture: has_refs_fournisseur=1, has_montant=1, document_type=facture devis: has_refs_fournisseur=0, has_montant=0, has_produit_mention=1 negociation: has_refs_fournisseur=1, has_montant=1, has_objection=1 benchmark: has_refs_fournisseur=1, has_montant=1, has_objection=0 → facture vs benchmark: separation sur document_type seul → negociation vs facture: separation sur has_objection seul → devis vs prospect: quasi-identiques sur 8 features
8 features categoriques/booleennes ne suffisent pas a separer 7 classes avec des profils aussi similaires. Le AUROC (0.726) confirme que le signal existe mais est faible.
Le dispatcher n'a pas besoin d'etre parfait. Il doit etre assez bon pour que le specialiste prenne le relais. Un dispatcher a 80% qui route vers un classifier a 95% donne 76% combined — mieux qu'un monolithe a 65%.
Quand le dispatcher est sur (confiance > 0.8), il a raison ~90% du temps. Quand il hesite (confiance ~0.3), il a raison ~40%. Le systeme peut exploiter cette calibration :
Le modele actuel utilise 8 features. Chaque feature supplementaire ajoute du signal dans l'espace de separation :
| Feature candidate | Signal attendu | Classe aidee |
|---|---|---|
| word_count | Prospect = court, facture = long | scoring_prospect |
| sender_domain_type | Interne vs externe vs inconnu | classification_email |
| n_product_lines | Facture/benchmark = multi-lignes | benchmark_offre |
| montant_range | Bucket 0/petit/moyen/grand | negociation_offre |
| has_deadline | Devis et reclamation = urgent | demande_devis |
| language_detected | FR/EN/mixed | all |
| has_attachment_ref | Facture = PJ PDF | controle_facture |
| n_entities | Benchmark = multi-fournisseurs | benchmark_offre |
| text_length | Email court vs document long | classification_email |
| has_pricing_table | Facture/benchmark structuree | controle_facture |
| sentiment_urgency | Reclamation = negatif/urgent | reclamation_client |
| has_legal_mention | Conditions generales = facture | controle_facture |
Target: AUROC > 0.85 avec 20 features. Le Dana Theorem garantit que la construction SAT reste polynomiale quel que soit le nombre de features.
Claude voit le texte complet et produit tache_detectee. Snake voit 8 features structurees et produit sa propre prediction. Deux signaux independants :
Quand Claude = Snake (estim. ~70% des cas): → Confiance maximale, route automatique Quand Claude ≠ Snake (~30% des cas): → Flag pour revue humaine → Ou: voter par confiance (Claude prob vs Snake prob)
L'ensemble n'a pas encore ete teste empiriquement. C'est la prochaine etape apres le feature expansion.
The controleur operates in two modes (/genesis for full details):
Mode 1: Haiku enabled (anthropic=true) Text → Claude Bedrock extraction → rich JSON → Snake dispatch Latency: ~1-3s | Quality: high | extraction_mode: "haiku" Mode 2: Regex fallback (anthropic=false, default) Text → regex pattern matching → minimal JSON → Snake dispatch Latency: ~10-50ms | Quality: viable | extraction_mode: "regex_fallback"
Snake classifies in both modes. The 8 features are derived differently but the model is the same. This means the controleur never fails — it degrades gracefully from LLM-backed extraction to pattern-matched extraction.