# database.policy.write_proposed — Appliquer à une table la politique que la plateforme propose, éprouvée avant.

> Engendrée depuis le registre. Ne pas modifier à la main.

Enchaîne database.policy.list et database.policy.write : lit la proposition engendrée pour la table, la pose, l'éprouve sur quatre personas et ne la valide qu'après confirmation si une ligne se voit sans être possédée. Une table fermée n'a pas de prédicat : rien n'est écrit.

| Propriété | Valeur |
| --- | --- |
| Niveau | `project` |
| Rang minimal | `maintainer` |
| Rôle transversal | — |
| Portées | `db:write`, `db:read` |
| Compte de service | ne la mène pas : cette écriture ne lui est pas ouverte |
| Réversibilité | E — réversible avec effort : validation d'une personne avant l'appel, puis cinq minutes pour tout défaire d'un seul appel |
| Idempotence | une clé d'idempotence est acceptée : le rejeu rend la première réponse |
| Limites de débit, par jeton | 600 appels par 60 secondes (`general`), et 60 appels par 60 secondes (`sensitive`) |

## API

`POST /v1/projects/{projectId}/database/policies/proposed` — succès en `200`.

| Paramètre | Où | Type | Requis | Description |
| --- | --- | --- | --- | --- |
| `projectId` | chemin | texte, motif `^prj_[0-9A-HJKMNP-TV-Z]{26}$` | oui | Identifiant de projet |
| `Idempotency-Key` | en-tête | texte, de 8 à 128 caractères | non | Clé d'idempotence. Un rejeu portant la même clé retourne le résultat initial sans nouvel effet de bord, et la réponse porte alors « Idempotency-Replayed: true ». Équivaut au champ « idempotencyKey » du corps ; les deux à la fois ne sont acceptés que s'ils sont identiques. |
| `table` | corps | texte, motif `^[a-z_][a-z0-9_]{0,62}$` | oui | Identifiant SQL en minuscules |
| `confirmationNonce` | corps | texte | non |  |
| `idempotencyKey` | corps | texte, de 8 à 128 caractères | non | Clé d'idempotence, obligatoire. Un rejeu portant la même clé rend le résultat initial, sans nouvel effet de bord. |

La réponse :

| Champ | Type | Description |
| --- | --- | --- |
| `proposal` | objet | La proposition lue, telle que database.policy.list la rend |
| `written` | objet (`applied`, `rewrite`, `verifications`, `report`, `indexCreated`, `undoToken`), ou nul | Ce que database.policy.write a rendu ; nul pour une table fermée |
| `undoToken` | nul | Aucun jeton : une politique se remplace par un nouvel appel, qui retire la précédente avant de poser la sienne. |

En-têtes de la réponse : `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`, `RateLimit-Policy`, `Idempotency-Replayed`.

Autres réponses : `400`, `401`, `403`, `404`, `409`, `429`, `500`, `503` — communes à toute opération.

## Ligne de commande

`bastide database policy write_proposed --project-id <valeur> --table <valeur>`

| Option | Type | Requise | Défaut | Description |
| --- | --- | --- | --- | --- |
| `--project-id` | texte | oui | — | Identifiant de projet |
| `--table` | texte | oui | — | Identifiant SQL en minuscules |
| `--confirmation-nonce` | texte | non | — |  |
| `--idempotency-key` | texte | non | — | Clé d'idempotence, obligatoire. Un rejeu portant la même clé rend le résultat initial, sans nouvel effet de bord. |

La commande demande une confirmation avant d'agir, sauf avec « --yes ».

## MCP

Outil `database_policy_write_proposed`.

| Propriété | Valeur |
| --- | --- |
| Lecture seule | non |
| Destructif | oui |
| Idempotent | oui |
| Monde ouvert | non |
| Confirmation en deux temps | non |
| Budget de jetons du résultat | 2500 |

## Erreurs

| Code | Surface | Cause |
| --- | --- | --- |
| `confirmation_requise` | les deux | L'opération est irréversible : elle se confirme en deux temps, par le nonce que ce refus porte. |
| `nonce_expire` | les deux | Le nonce de confirmation a plus de cinq minutes. |
| `nonce_invalide` | les deux | Le nonce de confirmation n'a pas été émis par ce serveur pour cet appel, ou il a déjà servi. |
| `validation_humaine_requise` | les deux | Une opération irréversible se valide par une personne, pas par un jeton de compte de service. |
| `backend_indisponible` | les deux | La base de données du projet n'est pas joignable par la plateforme ; le message nomme la cause. |
| `idempotency_key_conflict` | API | Deux clés d'idempotence différentes ont été présentées, dans le corps et dans l'en-tête. |

S'y ajoutent les refus communs à toute opération — entrée invalide, authentification, autorisation, cible introuvable, conflit, limite de débit, indisponibilité — que le catalogue des erreurs décrit.

## Exemples

Poser la politique proposée pour une table, éprouvée avant application :

```json
{
  "projectId": "prj_01JQ8ZK4M7NP2RSTVWXYZ34567",
  "table": "commandes",
  "idempotencyKey": "politique-proposee-commandes-2026-10-13"
}
```
