# “Proposer” protégé par groupe (whoami / editors)

## But
Le bouton **Proposer** (création d’issue Gitea pré-remplie) doit être :
- visible **uniquement** pour les membres du groupe `editors`,
- **absent** pour les autres utilisateurs,
- robuste (fail-closed), mais **non-collant** (pas de “bloqué” après un échec transitoire).

## Pré-requis (build-time)
Les variables publiques Astro doivent être injectées au build :
- `PUBLIC_GITEA_BASE`
- `PUBLIC_GITEA_OWNER`
- `PUBLIC_GITEA_REPO`

Si une seule manque → `giteaReady=false` → Proposer est désactivé.

### Vérification NAS (slots blue/green)
Exemple :
- blue : http://127.0.0.1:8081/...
- green : http://127.0.0.1:8082/...

Commande (ex) :
`curl -sS http://127.0.0.1:8081/archicratie/archicrat-ia/chapitre-4/ | grep -n "const GITEA_" | head`

## Signal d’auth (runtime) : `/_auth/whoami`
Le site appelle `/_auth/whoami` (same-origin) pour récupérer :
- `Remote-User`
- `Remote-Groups`
Ces headers sont injectés par la chaîne edge (Traefik → Authelia forward-auth).

### Appel robuste
- cache-bust : `?_=${Date.now()}`
- `cache: "no-store"`
- `credentials: "include"`

### Critère
`groups.includes("editors")`

## Comportement attendu (UX)
- utilisateur editors : le bouton “Proposer” est visible, ouvre la modal, puis ouvre Gitea.
- utilisateur non editors : le bouton “Proposer” n’existe pas (retiré du DOM).

## Pièges connus
1) Tester en direct 8081/8082 ne reflète pas toujours la chaîne Traefik+Authelia.
2) Un gate “collant” peut rester OFF si l’échec est mis en cache trop agressivement.
3) Si “Proposer” est caché via `style.display="none"`, il faut le réafficher via `style.display=""` (pas via `hidden=false`).

## Debug rapide (console navigateur)
en js :

(async () => {
  const r = await fetch("/_auth/whoami?_=" + Date.now(), {
    credentials: "include",
    cache: "no-store",
    redirect: "follow",
  });
  const t = await r.text();
  const groups = (t.match(/^Remote-Groups:\s*(.*)$/mi)?.[1] || "")
    .split(",").map(s => s.trim()).filter(Boolean);
  console.log({ ok: r.ok, status: r.status, groups, raw: t.slice(0, 220) + "..." });
})();

## Définition “done”

Archicratia (editors) voit Proposer et peut ouvrir un ticket.

s-FunX (non editors) ne voit pas Proposer.

Les deux slots blue/green injectent les constantes Gitea dans le HTML.
