# Le Mandat — paquet d'instructions paquet-1

Ce fichier est l'interface entre un outil de relevé et le site Le Mandat. Il est relu par
le site à chaque dépôt : ce qu'il promet est tenu par la base, pas par une charte.

## Ce que le site est, et ce que vous n'êtes pas

Le Mandat publie ce qu’une commune a promis et ce qu'elle en a fait. Une donnée publiée a
un auteur, un document d'où elle est tirée, et la décision nominative d’un instructeur.

Vous ne publiez rien. Vous relevez des passages, vous les déposez sur un poste de travail,
et un humain relit chaque ligne avant qu'elle devienne une proposition. Un compte
d'instruction tranche ensuite. Aucun de ces trois moments ne vous appartient.

## Ce qu'on vous demande de relever

Un engagement suivi est : Ce que le texte dit que la commune fera : une action désignée, imputable à la commune, datable ou chiffrable dans le texte, et écrite dans le document d'origine.

Ce texte et le critère de périmètre sont publiés par la méthode, dans sa version 1.0.
Ils se relisent à l’adresse `GET https://le-mandat.fr/api/methode`, et c’est cette adresse qu'il
faut interroger avant de commencer — pas ce fichier, qui peut avoir été copié.

La méthode générale — où chercher les élus, ce qu'on garde d'une source, ce qu'est un
engagement, ce qu'est une promesse — est un seul texte pour deux lecteurs : la personne
qui relit, et l'outil qui relève à sa place. Elle se lit à `https://le-mandat.fr/relever` et elle
est rendue entière par `GET https://le-mandat.fr/api/methode` (`methode.doctrine`). Ce fichier-ci
n'est que sa traduction en contrat d'écriture : ce qu'elle demande, la base le refuse ou
l'accepte, et ce n'est pas une recommandation.

## La règle qui commande tout le reste : le passage est copié

Le texte que vous déposez est celui du document, mot pour mot. Vous ne résumez pas, vous
ne reformulez pas, vous ne corrigez pas la ponctuation, vous ne remplacez pas une abréviation.

Le site relit le document et vérifie que le passage s'y retrouve. Un passage qui n'y est
pas retourne « à revérifier » et ne part pas. Les seuls écarts admis sont ceux que
l'extraction de texte laisse derrière elle : retours à la ligne et espaces multiples,
repliés en un seul espace. Rien d'autre n’est replié — ni les accents, ni les majuscules,
ni les guillemets, ni les tirets.

Un document dont le site ne peut pas tirer du texte — un scan, un PDF image — ne peut pas
être vérifié. Citez la page qui porte le texte, pas le fichier qui le contient en image.

## Avant de relever : lire ce que le site sait déjà

```
GET https://le-mandat.fr/api/methode      — version de la méthode, critère publié, définition d’un
                            engagement suivi, vocabulaire proscrit, référentiels ouverts
GET https://le-mandat.fr/api/perimetre    — communes suivies, avec leur code officiel, leur
                            population et le critère qui les a fait entrer
GET https://le-mandat.fr/relever          — la méthode générale, telle qu'une personne la lit :
                            c'est la même doctrine, et vous en faites la vôtre
```

Une commune que `/api/perimetre` ne rend pas n’est pas suivie. Vous pouvez la proposer —
vous ne pouvez pas l'écrire dans le périmètre : entrer une commune est une décision
d'administrateur pour la durée du mandat.

Le critère d'entrée publié est, en l'état :

> Commune dont le programme de la liste élue est intégralement lisible à une adresse publique que le site peut relire, et dont le conseil municipal est désignable par une source publique.

Il est tenu pour identique partout. Une proposition de commune peut le **recopier tel quel**
dans `critere_entree` — l'acceptation compare cette ligne au texte publié — **ou le laisser
absent** : la porte écrit alors elle-même le texte de la version en vigueur. Le recopier est
donc inutile, et l'écrire de travers est un refus : un accent passé par un mauvais encodage ne
se corrige plus à l'acceptation, six clics plus loin. Le changer, de toute façon, est une
nouvelle version de la méthode, et cela ne vous appartient pas.

## Écrire

```
POST https://le-mandat.fr/api/poste/<identifiant-du-poste>/lignes
Authorization: Bearer <jeton remis au contributeur>
Content-Type: application/json
```

Une ligne par écriture. Un candidat par requête : ce n’est pas une lenteur imposée, c’est
ce qui permet à une ligne refusée d'être refusée seule, avec sa raison, au lieu d'emporter
un lot avec elle.

Pour un engagement relevé dans une commune suivie :

```json
{
  "cible": "engagement",
  "code_insee": "99101",
  "charge": {
    "citation_originale": "Nous aménagerons cinq kilomètres de pistes cyclables.",
    "intitule_normalise": "Aménager cinq kilomètres de pistes cyclables",
    "competence": "communale",
    "domaine_code": "transport",
    "page_source": "p. 14",
    "echeance_declaree": "2028"
  },
  "sources": [
    {
      "titre": "Programme municipal 2026 de Val-Fictif",
      "type": "document_campagne",
      "url": "https://exemple.org/programme",
      "editeur": "Liste Val pour tous",
      "date_publication": "2026-02-01"
    }
  ]
}
```

Pour proposer une commune non suivie — `code_insee` est alors absent de la requête et
présent dans la charge :

```json
{
  "cible": "commune",
  "charge": {
    "code_insee": "69381",
    "nom": "Lyon",
    "code_departement": "69",
    "nom_departement": "Rhône",
    "code_postal": "69003",
    "population": 522963
  },
  "sources": [{ "titre": "…", "type": "document_campagne", "url": "https://…" }]
}
```

`critere_entree` est absent de cet exemple, et c'est le chemin recommandé : la porte écrit le
texte publié. `nom`, `code_departement`, `nom_departement` et `population` sont de toute
façon repris du référentiel national — les écrire ne sert qu'à ce que la ligne soit lisible dans
votre espace avant la relûre. Le corps de la requête part en **UTF-8** : c'est la seule cause de
refus que votre propre écriture peut rencontrer sans que personne ne l'ait relue.

`intitule_normalise` est la phrase du modèle ; `citation_originale` est le texte du
document. Les deux sont exigés, et ne se remplacent pas l'un l'autre. Le premier porte le
vocabulaire proscrit, pas le second : c’est le texte du programme, et il est montré encadré,
tel quel.

Vocabulaire proscrit dans un intitulé normalisé, en l'état du référentiel : ambitieux, austérité, bilan de santé, insuffisant, laxisme, manquement, non tenue, note, promesse, promesses, promis, renoncement, score, tenue, trahi, échec.

## Ce qui est fermé, et pourquoi

- **Rien n’est publié par cette porte.** Un engagement, un état d'avancement, un programme,
  un acte, un rattachement, un obstacle extérieur se publient par la fiche de la donnée,
  sous gel du programme et sous décision d'instruction.
- **Un jeton ne valide pas, n'envoie pas, ne révoque pas, ne publie pas.** Ces quatre actes
  sont des mains, pas des écritures. C'est ce qui rend supportable l'absence de plafond sur
  le nombre de lignes relevées.
- **Le nombre de lignes n’est pas borné par un quota éditorial.** Il est borné par ce
  qu’une porte admet par heure et par jour, et ces bornes sont écrites dans la base, pas
  dans ce fichier.
- **Pas de pourcentage de confiance, pas de score, pas d'appréciation.** Le produit constate.

## Quand une écriture est refusée

Le refus répond en français, avec sa raison, dans `erreur` :

```json
{ "erreur": "Ligne refusée : la commune 12345 n’est pas une commune suivie. Proposez-la —…" }
```

Un refus n’est pas une erreur de transport : il ne se rejoue pas à l'identique. Soit la
raison est corrigeable — un document mal nommé, un intitulé qui porte un mot proscrit, une
commune à proposer — soit elle ne l'est pas, et la ligne ne passera pas par cette porte.

## Ce que le contributeur doit savoir avant de vous donner un jeton

Un poste de travail est une porte ouverte à un outil qui n’est pas celui du site. Elle
porte un titulaire, une validité, et elle se ferme. Ce que vous allez lire sur des
documents — programmes, délibérations, presse locale — reste la source du passage que vous
relevez : le site ne rend jamais le corps d’un document qu'il a lu pour vérifier une ligne.

