Any indicator function over a finite discrete domain can be encoded as a SAT instance in polynomial time. Decision tree bucketing reduces this to linear time.
Snake proves by construction that you don't need to solve SAT to use SAT for classification. The formula is built directly from the data in polynomial time, then evaluated (also polynomial) at inference. The NP-hardness of SAT applies to finding satisfying assignments for arbitrary formulas — Snake never does that.
Where L = layers, n = samples, m = features, b = bucket size. Linear in samples and features, quadratic in bucket size.
| Model | Classes | Best Accuracy | Best Iter |
|---|---|---|---|
| scoring | A (chaud) / B (tiede) / C (froid) / D (perdu) | 93.3% | 7 |
| objection | Prix / Delai / Qualite / Relation / Inertie / Concurrent | 100.0% | 2 |
| action | Relancer / Attendre / Contre-offre / Escalade / Abandonner | 93.3% | 7 |
| canal | Email / Telephone / Visite / LinkedIn | 95.6% | 9 |
| timing | Immediat / Sous_3j / Sous_7j / Attendre_signal | 95.6% | 9 |
Each model is a standalone Snake SAT classifier trained on 20 flattened features extracted from CRM data via Claude Haiku. Models are independent — they can be retrained individually without affecting others.
Only 1.5% of synthetic data qualifies for the Attendre label. The label function requires a narrow conjunction: tone == "negatif" AND jours < 14 AND scoring == C. With 800-1700 samples, this produces 2-9 test examples — not enough for Snake to learn a generalizable pattern.
Visite requires tone == "positif" AND has_visite AND jours < 10. Same problem: too rare in random generation.
Attendre into a "Hold" superclass with Attendre_signal (timing), or oversample deliberately. For Visite, relax the conditions or inject targeted examples. Neither affects the other 3-4 healthy classes.
Text in (CRM dump, plain French)
→ Claude Haiku EXTRACTS → 20 structured features (JSON)
→ Snake SAT CLASSIFIES → 5 predictions + probabilities
→ Claude Haiku GENERATES → personalized message
→ JSON response with XAI audit
Why Snake sits between two Claude calls:
Claude extracts (infinite text → 20 features). An LLM is the right tool for turning "Marc said it's too expensive compared to their current supplier, asking for -12%" into {"objection_type": "prix", "gravite": "traitable"}.
Snake classifies (20 features → discrete predictions, explainable). A SAT formula is the right tool for turning 20 features into "Contre-offre with 62% confidence" with a human-readable audit trail. No black box.
Claude generates (predictions + constraints → personalized message). An LLM is the right tool for writing a French business email. But it MUST respect Snake's constraints: remise max -10%, marge min 18%, don't name the competitor. Without Snake as guardrail, the LLM hallucinates discounts.
| Iter | Layers | Noise | Telephone Acc | Overall Acc |
|---|---|---|---|---|
| 0 | 15 | 0.30 | 48.4% | 85.0% |
| 3 | 15 | 0.30 | 58.3% | 91.8% |
| 5 | 25 | 0.50 | 75.6% | 94.2% |
| 9 | 35 | 0.75 | 83.7% | 95.6% |
More layers + noise gave Snake enough stochastic diversity to distinguish Telephone from Email. The 10x method: measure each module's P(success)/ms_on_success, then deploy the winner.
iter 0-4: L=15, B=150, noise=0.30 (baseline) iter 5-7: L=25, B=150, noise=0.50 (more layers + noise after B/C confusion) iter 8-9: L=35, B=100, noise=0.75 (smaller buckets, high noise per LLPS findings) iter 3+: borderline edge cases (jours=14/15/21/30/31, CA boundaries) iter 6+: contradictory signal combos (high positive + high negative)