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>
12 KiB
fokan — la veille du foyer
Service web qui monte la garde sur les échéances dormantes du foyer (maison, véhicules, papiers, enfance & scolarité, animaux) et en tient le registre, sans jamais créer de tâche nouvelle pour l'utilisateur.
Personne ne retient tout ça — c'est normal. Nous, c'est notre métier.
Marque sœur de Kankwa, éditée par MIAW. Nom de code : fokan (naming définitif à confirmer).
L'essentiel
- Un quiz de 2 minutes (9 écrans) plus des détections gratuites — adresse (BAN, DPE ADEME, Géorisques, ZFE, arrêtés, restrictions d'eau, calendrier scolaire de l'académie) et carte grise (champ K → référentiel RDW pour le modèle, RappelConso pour les rappels de ta version) — produisent le calendrier complet du foyer, 30 à 50 échéances, sans saisie obligatoire.
- Le mail est le moteur : rappels rares, au bon moment, avec l'action incluse. Réaction en 10 s, ou ignorance sans conséquence — le glissement est dans le design.
- Une carte des périmètres réglementaires : cinq couches (nucléaire, sécheresse, ZFE, PPRT, inondation), où la frontière EST la règle. Une couche est de la configuration, pas du code (D-022 → D-031).
- Révélation graduée : avant la porte = l'inventaire (total, rythme de l'année, 2-3 échéances en clair, des halos sans frontière). Après = full reveal, veille active, rappels, flux ics vivant, catalogue de guides, enrichissement continu.
- Deux modes d'accès, une variable (
FOKAN_MODE, D-065) :gratuit— une adresse suffit, avec un plafond de comptes (FOKAN_PLACES_GRATUITES) et une liste d'attente au-delà — oupayant— 19,99 €/an par foyer via Stripe. Le défaut estpayant, pour qu'une variable oubliée n'ouvre jamais l'accès par accident. Dans les deux cas la contrepartie ne s'affiche qu'après le quiz (D-028), et la porte du produit (getSubscription().isActive) ignore lequel des deux est actif. - La barrière : la base de connaissance des échéances françaises et le pipeline de compréhension de documents. Le produit, c'est le savoir ; le code n'est que son véhicule.
Où en est le produit
| Brique | État |
|---|---|
| Base de connaissance | 78 fiches bicéphales (moteur + page SEO), validées par schéma. Quatre d'entre elles se filtrent sur une tranche de revenus déclarée au quiz (D-051) — elle retire une fiche hors de portée, elle n'affirme jamais un droit |
| Moteur de réconciliation | Livré, pur, 905 tests verts |
| Carte des périmètres | Livrée (D-022 → D-031) — 5 couches (nucléaire, sécheresse, ZFE, PPRT, inondation), fond IGN désaturé chargé par le navigateur, aperçu bridé structurellement |
| Fermeture du réseau cuivre | Livrée (D-031) — 34 915 communes en base, date de coupure par commune, question fibre/ADSL au quiz |
| Rappels de véhicules | RappelConso seul (D-032) — 1 662 campagnes, le défaut décrit en clair et en français. Le registre néerlandais est retiré : deux fois moins de campagnes, rien avant 2018, et c'est assumé. Le champ K qualifie depuis D-034 — 3 703 réceptions ingérées, « ta version » distinguée de « ton modèle », sans jamais rien masquer |
| Deux-roues motorisés | Contrôle technique livré (D-031) — 5 ans puis 3 ans. Référentiel de modèles et barème Crit'Air deux-roues : non faits, assumés |
| Pages légales | Livrées (D-028) — mentions, CGV, confidentialité ; les champs que le code ne peut pas connaître s'affichent en jaune |
| Gestes du foyer (« fait », muet, responsable, date apprise) | ❌ Absents — les colonnes existent, rien ne les écrit, et chaque mail de rappel les promet. Voir audit du 30/07 § 1 |
| Purge de conservation RGPD · récap annuel L215-1 | ❌ Absents — deux engagements publiés et non tenus (D-028 § 6) |
| Quiz + écran de fabrication en flux | Livré |
| Pilier maison | Phases 0, 1 et 2 livrées (Géorisques, ZFE, veille CatNat/VigiEau) |
| Pilier véhicules | Identification, rappels constructeur, Crit'Air/ZFE livrés ; distribution livrée côté moteur, en cours de sourcing côté donnée |
| Pilier papiers | Fiches livrées ; les quatre titres d'identité se calent sur les vacances réelles de l'académie (D-019) |
| Pilier enfance & scolarité | 5e pilier, ouvert le 28/07/2026 (D-019) — bourses collège et lycée, Parcoursup, inscriptions maternelle et lycée, assurance scolaire, DSE, et la déclaration de scolarité des 16-18 ans sans laquelle la Caf ne verse pas l'ARS (D-051) |
| Pilier animaux | Fiches livrées ; garde-vacances calée sur le calendrier scolaire (D-019) |
| Calendrier scolaire | Livré (D-019) — API Éducation nationale, grain académie, rafraîchi au passage hebdomadaire |
| Comptes, accès, notifications | better-auth, scheduler quotidien — livrés. Deux portes d'accès : inscription gratuite (/api/activer) ou Stripe (clés de test), au choix de FOKAN_MODE (D-065) |
| Liste d'attente | Livrée (08/08/2026, D-065) — pas de table : un subscription_status = "attente" et le passage de 4 h qui admet dans l'ordre d'arrivée. Relever FOKAN_PLACES_GRATUITES suffit à ouvrir des places |
| Contrats | 8 types déclarables au quiz, 8 fiches |
| Rejeu du quiz | Livré (28/07/2026) — un foyer dont l'accès est ouvert met à jour ses déclarations, garde-fou de cinq rejeux par an (D-060) : les dates sont conservées, le quota se recompte contre la période en cours (ou une année glissante quand il n'y en a pas, cas de l'accès gratuit), donc rien ne tourne à la date de remise à zéro |
| CI, lint, migrations versionnées | Livrés (28/07/2026) — cf. .github/workflows/ci.yml, drizzle/ |
| Sauvegardes | Absentes — seul risque que le cadrage qualifie d'inacceptable (§ 24.2), différé à la demande du porteur de projet |
Documents
Source de vérité
- docs/cadrage-projet-fokan.md — cadrage produit + architecture technique de référence, validé point par point le 22 juillet 2026.
- docs/decisions.md — journal des décisions post-cadrage (D-001 → D-062). Toute divergence avec le cadrage y est tranchée et datée.
- CLAUDE.md — règles de travail sur ce dépôt (constitution produit, invariants d'architecture, stack).
Audit — ils se complètent, ils ne se remplacent pas
- docs/audit-2026-07-30.md — connaissance, piliers, documents, et le classement des ajouts par valeur pour un foyer français moyen. Répond aussi à « manque-t-il un pilier ». À lire avant d'ouvrir un chantier produit — le § 8 donne l'ordre.
- docs/audit-2026-07-28.md — sécurité et exploitation, toujours la référence sur ces deux volets. Son seul point resté ouvert : E3, les sauvegardes.
- docs/audit-mail-2026-07-30.md — le service mail de bout en bout : les cinq messages qui peuvent partir, leurs déclencheurs, leurs conditions.
- docs/audit-ressources-2026-08-05.md — les conditions de ressources : pourquoi une seule question suffit malgré cinq dénominateurs différents, ce que coûte la conversion depuis le net mensuel, et l'audit aide par aide de ce qui mérite une fiche. Seule référence sur ce volet.
Par pilier
- docs/pilier-logement.md — ce qu'une adresse française permet de savoir gratuitement. Le plus abouti.
- docs/pilier-vehicules.md — ce qu'une carte grise permet de savoir, et ce qu'on a renoncé à en tirer.
- docs/pilier-papiers.md — la valeur n'est pas la date d'expiration, c'est ce qu'il y a devant.
- docs/pilier-scolarite.md — le 5e pilier : six fenêtres que personne ne surveille, toutes inférées de l'année de naissance.
- docs/pilier-animaux.md — deux questions, six échéances, une seule dépendance externe.
- docs/pilier-contrats.md — chantier transverse, pas un pilier (§ 5.6).
Phase 0 (historique — voir les avertissements en tête de chaque fichier)
- docs/phase-0/quiz.md — les 9 écrans, réponses et inférences. Réaligné sur le code le 28/07/2026.
- docs/phase-0/landing.md — spec de la landing. Dépassée sur le prix, l'ics et le hub figé.
- docs/phase-0/etude-api-plaque.md — étude close : D-002 annulée par D-004, aucune API plaque n'est utilisée.
Développement
npm install
npm run dev # next dev -H 0.0.0.0
npm test # vitest — priorité absolue : le moteur de réconciliation
npm run typecheck
npm run lint # eslint-config-next, épinglé sur la version exacte de next
npm run knowledge:check # valide les 78 fiches YAML (Zod, IDs uniques, slugs, pages, barèmes de ressources à jour)
npm run db:generate # génère une migration Drizzle depuis src/db/schema.ts
npm run db:migrate # joue les migrations en attente — appelé automatiquement au démarrage du conteneur
npm run db:push # ⚠️ raccourci dev uniquement — ne jamais l'utiliser en production (audit E2)
npm run reconcile:all # rejoue la réconciliation sur tous les foyers
npm run vehicules:sync # référentiel RDW (~2 h)
npm run distribution:queue # file de sourcing des codes moteur, les plus utiles d'abord
npm run distribution:seed # amorçage du référentiel de distribution, idempotent
npm run cuivre:sync # fermeture du réseau cuivre (760 ko, ~5 s) — à jouer au déploiement
npm run rappels:sync # rappels RappelConso (jouer vehicules:sync avant, il lit le catalogue)
npm run rappels:simuler -- <householdId> # ce qui partirait aujourd'hui pour un foyer, sans envoyer
Le projet tourne en conteneur Docker (docker-compose.yml) : fokan-db (Postgres 16) et fokan-app, exposée sur 127.0.0.1:3100. Les crons vivent dans le même processus que Next.js (src/instrumentation.ts, pg-boss) : veille des arrêtés à 3 h, réconciliation à 4 h, rappels à 8 h, référentiel véhicules le dimanche à 0h30 — heure de Paris.
Roadmap
- ✅ Phase 0 — landing, quiz réel, hub à révélation graduée, carte, pages légales. (La contrepartie a quitté la landing : elle ne s'affiche qu'après le quiz, D-028.)
- MVP — la veille seule (en cours) : les rappels mail, la CI, les migrations, la carte et les gestes du foyer sont livrés ; restent le sourcing des intervalles de distribution et les sauvegardes (seul risque que le cadrage qualifie d'inacceptable, § 24.2 — traité à l'échelle du serveur, hors de ce dépôt depuis D-054).
- Phase 2 — pipeline de compréhension de documents (mail entrant) + bannette ; les contrats se renseignent par transfert de PDF. C'est aussi ce qui débloquerait les rappels de produits non-véhicules (bébés-enfants, maison, électroménager).
- Phase 3 — scan photo, multiplicateurs (foyer des parents, bien locatif — ⚠️ rouvre D-021 : « un compte ne porte qu'un foyer »), affiliation activée.
Prochains chantiers, dans l'ordre (D-054, qui reclasse l'audit du 30/07 § 8) : ① le sourcing des intervalles de courroie, seul travail qui fasse parler la distribution · ② le récap annuel, message encore absent (le mail de fin d'abonnement, lui, n'a plus d'objet tant que FOKAN_MODE=gratuit) · ③ la purge RGPD — son échéance change avec D-065 : elle n'était due qu'à la fin d'une première année d'abonnement non renouvelé, or un accès gratuit ne se termine jamais. Ce qui la déclenche désormais est le premier foyer dormant depuis douze mois, ce que la politique de confidentialité annonce · ④ nom et identité.
Les gestes du foyer — « fait » / « déjà fait », sourdine, reprise, responsable — sont livrés le 06/08/2026 (D-055) : c'était le premier de cette liste depuis l'audit du 30/07, et le seul chantier qui augmentait la valeur de tout l'existant.