---
suivi: 1285
date: 2026-08-12
sujet: diag_confidentialite_foncier
chantier: module-foncier
type: diagnostic
statut: poussé
hash: 9dd8d233
fichiers:
  - tools/diag/diag_confidentialite_foncier_1285.php
  - docs/suivi/SUIVI_1285_diag_confidentialite_foncier.md
---

## PROMPT ENVOYÉ

PHASE 1 — DIAGNOSTIC DE CONFIDENTIALITÉ. Cloisonnement foncier demandé
BLOQUANT par Robin. Inventaire consommateurs, périmètre ACL #1116,
record_habilitations, paquet de négociation sans rebond, coût chiffré du
passage en bloquant, points d’arbitrage. Aucune modification applicative.
Script diag + fiche uniquement. Fix = lot séparé après validation Robin.

## SYNTHÈSE

### Demande

Passer de `mon_secteur` (confort d’affichage, `ParcelleProspectionQuery:256`)
à une restriction de droits. Complément : paquet de négociation par
propriétaire (sans rebond co-indivisaire) + partage nominatif « Lahouari
autorise Eric sur sa parcelle ».

### Écart confort vs vraie ACL

| Mécanisme | Rôle réel | Bloquant ? |
|-----------|-----------|------------|
| `mon_secteur` (#1076/#1281/#1283) | Filtre liste Prospection | **NON** — décocher = voir tout ce que l’ACL laisse |
| `FoncierReferentielVisibiliteScope` (#1116) | Scope SQL Parcelle + Proprietaire | **OUI** sur listes/fiches (404 binding) |
| `RecordHabilitationScope` (#1075) | Scope SQL DossierFoncier | **OUI** |

### Découverte structurante (lecture code)

Les diags #1281 / #1283 **n’appelaient pas `Auth::setUser`**. Or
`FoncierReferentielVisibiliteScope` no-op si `Auth::user()` absent.
→ La mesure « sans filtre, les 36 voient les 4 » est un **artifact CLI**
possible, pas forcément le comportement navigateur. Le script #1285
corrige (Auth::setUser mémoire). À rejouer en PROD.

Si en UI réelle Lahouari voit les 4 d’Eric avec `mon_secteur` OFF : alors
soit `createur_id` NULL, soit partage, soit fuite — le script section 5 le
tranche.

### Périmètre ACL #1116

- Modèles : **Parcelle**, **Proprietaire** uniquement.
- Règle : `createur_id` NULL ∪ créateur∈(moi+partageurs) ∪ visibilité
  unitaire ∪ bypass DG/DSI/Admin (`m365GroupNames` brut).
- Robin 5 / Eric 1 (propriétaires sans parcelle) : bypass admin vs créateur.
- Contournements volontaires : recherches forms, corbeille, patrimoine,
  doublons (`queryWithoutReferentielAcl`).
- Lectures seulement (le scope) ; écritures = `foncier.gestion`.

### `record_habilitations`

- Polymorphe via **`habilitable_type` / `habilitable_id`** — **pas**
  `record_type` (colonne absente → log 05/08 = bug de nom, table OK).
- Branché sur **DossierFoncier** seulement ; droits `lecture|gestion`.
- Accorde : créateur ou DG/DSI/Admin. Bloquant oui (scope+policy).
- Pour partage nominatif parcelle : schema OK, trait non branché ; alternative
  déjà là : `foncier_referentiel_visibilites` (grant unitaire #1116).

### Paquet de négociation

- Lien : `parcelle_proprietaire` (détentions actuelles).
- Sans rebond co-indivisaire (décision Robin).
- Arbitrage **ouvert** : même dossier hors périmètre → visible ? (4e)

### Coût mode bloquant (mesure 12/08 prise pour acquis + logique)

Avec `mon_secteur` ON aujourd’hui : Robin/Laury/Guilhem/Eric = 4 ; **32 = 0**.
Rendre bloquant ≈ forcer ce filtre → **32 utilisateurs sur 36 à 0 parcelle**
(sous réserve re-mesure Auth en prod). Dirigeants (Admin/DG) restent en vue
complète (#1283). Paramétrer les secteurs **avant** est l’arbitrage clé.

### Fiches lues

#1281 (confort, LEÇON défaut ON), #1283 (accès total Admin/DG, consommateurs
mon_secteur), #1116 (ACL référentiel + recherches hors filtre), #1075 (record
habilitations), #1076 (secteurs), #1234 (mécaniques droits). Approche
changée : Auth::setUser obligatoire ; ne pas conclure depuis diags sans Auth.

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php -d display_errors=1 tools/diag/diag_confidentialite_foncier_1285.php
```

Coller la sortie section 5–6 (matrice + phrase chiffrée). Aucune migration /
journal / rebuild.

## LEÇON

Un scope ACL qui short-circuit si `Auth` absent rend **tout diag CLI
optimiste** (tout le monde voit tout). Mesurer la confidentialité sans
`Auth::setUser` = mesurer l’absence de filtre, pas la prod. Toujours
séparer artifact CLI / session web, et signaler les contradictions entre
sections plutôt que de choisir.
