Metadata-Version: 2.4
Name: erotetique
Version: 0.2.2
Summary: Préprocesseur érotétique — prétraitement formel des questions avant le moteur de réponse
Author-email: Luc Bizeul <lbizeul@gmail.com>
License: IKCL-0.1
License-File: LICENCE.md
Keywords: erotetique,mcp,ontology,question-engineering,sdd
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: French
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.11
Requires-Dist: pyshacl>=0.25
Requires-Dist: python-dotenv>=1.0
Requires-Dist: rdflib>=7.0
Provides-Extra: rag
Requires-Dist: pypdf>=4.0; extra == 'rag'
Requires-Dist: python-docx>=0.8.11; extra == 'rag'
Requires-Dist: rank-bm25>=0.2.2; extra == 'rag'
Description-Content-Type: text/markdown

# Préprocesseur érotétique

*Les LLM ont résolu le problème de la réponse — la capacité d'exécution est quasi-illimitée.*
*Le goulot est désormais la question : pour la première fois dans l'histoire, l'outil dépasse structurellement la capacité de spécification de celui qui s'en sert.*

→ [Manifeste](docs/manifeste.md) · [Livre blanc](docs/livre-blanc.md)

| Format | Fichier | Statut |
|---|---|---|
| F1 — Positioning Statement | `docs/positioning-statement.md` | brouillon |
| F3 — Manifeste | `docs/manifeste.md` | brouillon |
| F5 — Livre blanc | `docs/livre-blanc.md` | brouillon |
| G0 — Ontologie | `erotetique/ontology/erotetique.ttl` | brouillon |
| CQ — Competency Questions | `erotetique/ontology/cq-erotetique.ttl` | brouillon |

> **Docs inclus dans distribution.** Après `pip install erotetique`, fichiers à: `site-packages/erotetique/docs/`

---

## Architecture

```
ontology/erotetique.ttl          ← G0 source de vérité (dimensions, quadrants, outils, opérations)
ontology/erotetique-shapes.ttl   ← contraintes SHACL
ontology/cq-erotetique.ttl       ← 7 Competency Questions SPARQL

erotetique/
  classifier.py   ← lit quadrants depuis Turtle, classification linguistique
  soundness.py    ← extraction heuristique présupposés
  augmenter.py    ← lit dimensions depuis Turtle, génère prompt dynamique
  server.py       ← MCP JSON-RPC stdio
```

**Invariant SDD** — le code ne connaît ni les dimensions ni les quadrants. Tout est lu depuis le Turtle au runtime. Ajouter une dimension dans `erotetique.ttl` = elle apparaît dans l'analyse sans toucher au Python (`test_sdd_acid_test` le vérifie).

---

## Installation

```bash
uv sync
uv run pytest        # 67 tests
```

Claude Desktop — `~/Library/Application Support/Claude/claude_desktop_config.json` :

```json
{
  "mcpServers": {
    "erotetique": {
      "command": "/opt/homebrew/bin/uv",
      "args": ["run", "--project", "/Users/luc/Projets/erotetique", "python", "-m", "erotetique.server"],
      "env": { "HOME": "/Users/luc" }
    }
  }
}
```

---

## Usage as Python Library

Install from PyPI:

```bash
pip install erotetique
```

Or locally (editable mode for development):

```bash
pip install -e /path/to/erotetique
```

Basic usage:

```python
from erotetique import classify_question, check_soundness, valorize_question
from pathlib import Path

# Locate ontology (installed as package data)
ontology = Path(__file__).parent / "erotetique" / "ontology" / "erotetique.ttl"

question = "Pourquoi notre chiffre d'affaires a-t-il baissé ?"

# Classify into ignorance quadrant (KK/KU/UK/UU)
result = classify_question(question, ontology)
print(f"Quadrant: {result.quadrant_label}")
print(f"Action: {result.action}")

# Check soundness and extract presuppositions
soundness = check_soundness(question)
print(f"Sound: {soundness.sound}")
for p in soundness.presuppositions[:3]:
    print(f"  • {p.text}")

# Estimate value of information (two proxies)
voi = valorize_question(question, result, ontology)
print(f"VoI score (proxy 1 — decisional sensitivity): {voi.score:.2f}")
print(f"VoI score (proxy 2 — prior entropy): {voi.proxy2_score:.2f}")
print(f"Prescribed operations: {', '.join(voi.prescribed_operations)}")
```

### Key Types

- **`ClassificationResult`** — quadrant URI, label, rationale, action
- **`SoundnessResult`** — `sound: bool`, `presuppositions: list[PresuppositionCheck]`
- **`VoIEstimate`** — `score: float`, `proxy2_score: float`, `prescribed_operations: list[str]`, `rationale: str`

### Architecture

All logic is **deterministic, LLM-free, zero network**:

- **Classifier** reads quadrant definitions from ontology at runtime (SDD invariant)
- **Soundness** extracts presuppositions heuristically (linguistic patterns)
- **Valorizer** estimates VoI via two proxies:
  - **Proxy 1**: Decision-marker sensitivity (choisir, sélectionner, décider keywords → VoI ↑)
  - **Proxy 2**: Prior entropy of answer distribution (enumerable answers → low entropy; causal questions → high entropy)

---

## Stack

| Composant | Techno |
|---|---|
| Ontologie | Turtle — `rdflib` |
| Validation | SHACL — `pyshacl` |
| Classification | Linguistique pure — `re` |
| MCP | JSON-RPC stdio |
| LLM | Claude Desktop (le client *est* le LLM) |

Zéro clé API. Zéro base externe. Zéro dépendance réseau au runtime.
