fokan/drizzle
Gautier Stefanini 62a7b0216d Le modèle économique était gravé dans quinze écrans et trois pages légales
Passer fokan en gratuit demandait de toucher le prix, le mur, les CGV, la
politique de confidentialité, les messages d'erreur d'API et jusqu'au texte
affiché dans l'agenda du foyer. `FOKAN_MODE` remplace tout ça par un mot, avec
« payant » pour défaut — une variable oubliée ne doit jamais ouvrir l'accès.

Ce qui rend la bascule bon marché était déjà là : `getSubscription().isActive`
est la porte unique du produit, et un accès gratuit est un statut « active »
sans date de fin, que `!periodEnd` rendait déjà permanent. Elle n'a pas changé.
Le mode décide de ce qu'on raconte à qui n'est pas entré, jamais de ce qu'on
lui ouvre.

La liste d'attente n'existe pas : pas de table, pas de file, pas de rang
stocké. Un foyer sans place porte le statut « attente », et le passage de 4 h
admet les plus anciens sur `attente_depuis`. Relever FOKAN_PLACES_GRATUITES
suffit — la variable est relue à chaque exécution du cron.

Trois pièges fermés au passage :

- le mode se lit côté serveur et descend en props. `process.env` n'existe pas
  dans le bundle navigateur : un import depuis un composant client aurait rendu
  « payant » côté client et « gratuit » côté serveur, en silence, à
  l'hydratation ;
- /api/checkout est fermé au serveur, pas seulement à l'écran. Une clé Stripe
  encore présente — le cas normal d'une bascule qu'on veut pouvoir défaire —
  l'aurait fait aboutir, et on aurait encaissé pour un accès offert ;
- /api/stripe/portal reste ouvert. Un abonnement souscrit en ligne doit se
  résilier en ligne (art. L215-1-1) : fermer la sortie parce qu'on ferme
  l'entrée enfermerait ceux qui ont payé.

Cinq mentions légales tombent avec la vente — SIREN, téléphone, médiateur,
régime de TVA, garantie de conformité — parce qu'un article décrivant une
obligation qui n'existe pas est pire qu'un article absent. Deux apparaissent :
la gratuité (un service gratuit qui tait son financement se fait lire « c'est
toi le produit ») et le plafond d'accès, qui est une limitation subie. La
politique de confidentialité perd Stripe quatre fois : déclarer un
sous-traitant qui ne traite rien n'est pas prudent, c'est inexact.

Un test rend réellement les trois pages dans les deux modes plutôt que de
relire des ternaires — c'est la seule façon de vérifier qu'aucune n'affirme
une chose fausse, et il tient aussi la numérotation des articles.

Corrigé en passant : les mentions légales renvoyaient encore les sources vers
la page d'accueil, où D-064 les a retirées la veille.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 19:18:49 +00:00
..
meta Le modèle économique était gravé dans quinze écrans et trois pages légales 2026-08-08 19:18:49 +00:00
0000_left_shen.sql Audit de sécurité et fonctionnel : correctifs appliqués, quiz rejouable (D-018) 2026-07-28 13:05:55 +00:00
0001_overconfident_baron_strucker.sql Audit de sécurité et fonctionnel : correctifs appliqués, quiz rejouable (D-018) 2026-07-28 13:05:55 +00:00
0002_cool_red_shift.sql Le calendrier scolaire entre, et avec lui un cinquième pilier (D-019) 2026-07-28 16:40:59 +00:00
0003_overconfident_captain_britain.sql Les périmètres d'iode entrent : 85 installations deviennent 42 sites 2026-07-29 11:05:23 +00:00
0004_blushing_groot.sql Les PPRT entrent par le seul filtre que le serveur accepte : l'espace 2026-07-29 11:26:56 +00:00
0005_colossal_warbound.sql La sécheresse et les PPRT rejoignent la carte, chacune par son obstacle 2026-07-29 11:39:28 +00:00
0006_wooden_joystick.sql Cinq des six ZFE absentes rejoignent la carte, chacune par sa source 2026-07-29 14:48:52 +00:00
0007_loving_red_skull.sql Chaque site nucléaire porte son propre périmètre, et la carte cesse de tout peindre pareil 2026-07-29 16:29:29 +00:00
0008_long_wither.sql Cinq chantiers du lot validé, dont un registre de rappels qui en remplace un autre 2026-07-30 14:27:41 +00:00
0009_magical_tombstone.sql Cinq chantiers du lot validé, dont un registre de rappels qui en remplace un autre 2026-07-30 14:27:41 +00:00
0010_thick_lord_tyger.sql Cinq chantiers du lot validé, dont un registre de rappels qui en remplace un autre 2026-07-30 14:27:41 +00:00
0011_empty_sharon_carter.sql Cinq chantiers du lot validé, dont un registre de rappels qui en remplace un autre 2026-07-30 14:27:41 +00:00
0012_regular_thing.sql Le champ K dit enfin quelle version est visée, sans jamais faire taire le reste 2026-07-30 17:47:05 +00:00
0013_odd_micromax.sql Un PPRT sur six est publié en morceaux, et on n'en gardait qu'un 2026-07-30 22:17:05 +00:00
0014_volatile_whirlwind.sql Une zone gardait un anneau sur 112, et la carte n'en disait rien 2026-07-30 22:41:41 +00:00
0015_bitter_eternity.sql Une zone gardait un anneau sur 112, et la carte n'en disait rien 2026-07-30 22:41:41 +00:00
0016_right_jamie_braddock.sql L'outbox se taisait pour tout le foyer dès qu'un seul membre avait reçu 2026-07-31 12:02:56 +00:00
0017_needy_callisto.sql Le rail « à lire aussi » ouvrait les 76 guides à qui ne payait rien 2026-07-31 12:03:51 +00:00
0018_open_nick_fury.sql Rien ne permettait de couper les rappels, et la timeline n'appendait rien 2026-08-05 13:37:51 +00:00
0019_stiff_lifeguard.sql Chaque mail promettait trois gestes ; la base de connaissance savait déjà lesquels 2026-08-06 21:22:07 +00:00
0020_deep_maestro.sql Chaque mail promettait trois gestes ; la base de connaissance savait déjà lesquels 2026-08-06 21:22:07 +00:00
0021_shallow_ricochet.sql Vérifier ses papiers une fois les effaçait pour toujours 2026-08-07 09:29:43 +00:00
0022_modern_scrambler.sql Le garde-fou du rejeu comptait les jours, pas les rejeux 2026-08-07 11:43:23 +00:00
0023_tiresome_rumiko_fujikawa.sql Le garde-fou du rejeu comptait les jours, pas les rejeux 2026-08-07 11:43:23 +00:00
0024_lucky_the_hood.sql Rejouer le quiz effaçait des contrats et un délai de travaux encore ouvert 2026-08-07 13:37:33 +00:00
0025_daffy_xorn.sql Le modèle économique était gravé dans quinze écrans et trois pages légales 2026-08-08 19:18:49 +00:00