PLAN D’ACTION CONCRET — Refonte doc Fluximmo
Fichier d’exécution (≠RECOMMENDATION_IMPROVE_DOC.mdqui est la spec/recommandation). Objectif : refondredoc.fluximmo.ioen 6 phases (dont 4 parallélisées). Estimation totale : 8-12 jours-homme (compressible à 4-6 jours calendaires si exécution parallèle agressive).
Pré-requis (à valider avant lancement)
| # | Pré-requis | Owner | Status |
|---|---|---|---|
| 1 | Clé API test gratuite active sur my.fluximmo.io (1 semaine) — pour validation live des exemples | Tim | À fournir |
| 2 | URL de base API publique confirmée (https://api.fluximmo.io/v2/... ou autre) | Tim | À confirmer |
| 3 | Accès lecture aux 3 repos : api_fluximmo_v2, elasticimmo, prod_fluximmo/v2/_workers | OK | ✅ |
| 4 | mintlify CLI installé localement (npm i -g mintlify) pour preview | Doc owner | À installer |
| 5 | Clé API test pour validator agent (lecture seule) — peut être la même que #1 | Tim | À fournir |
| 6 | Décision palette validée : indigo #1E40AF / emerald #10B981 | ✅ | Acté |
| 7 | Accès écriture sur le repo doc (branche feature/refonte-doc-v2) | Doc owner | OK |
⚠️ Sans pré-requis #1 + #2 + #5, la Phase 3 (validation live) est bloquée. Les autres phases peuvent démarrer.
Vue d’ensemble — 6 phases
- Phase 2 dépend de Phase 1 (structure mint.json en place)
- Phase 3 dépend de Phase 2 (concepts en place pour cross-link)
- Phase 4 dépend de Phase 3 (exemples validés réutilisés dans playbooks)
- Phase 5 partiellement indépendant (peut démarrer pendant Phase 4)
- Phase 6 dépend de tout
Phase 1 — Foundation (parallèle x3, ~1 jour)
Goal : poser une base saine (navigation, titres, brand) avant tout enrichissement. Lancer en parallèle (single message, 3 tool calls simultanés) :Agent 1.A — Refonte mint.json
- Mission : appliquer la structure 5 sections Démarrer / Concepts / Playbooks / API Reference / Ressources (cf RECOMMENDATION §6).
- Actions :
- Réorganiser
navigationselon §6 - Retirer entrées orphelines / doublons (mais garder Analytics tel quel per consigne — placeholder v3)
- Retirer toute référence aux endpoints
/v1/*(legacy supprimés de la doc publique) - Mettre à jour
colors: primary#1E40AF, accent#10B981, gradient anchors - Ajouter
background.decoration: "gradient"+ colors light/dark - Activer
appearance.default: "system" - Topbar : retirer
Réserver un appel(Calendly), garderMon compte+Nous contacter(email)
- Réorganiser
- Output :
mint.jsonpropre, validé viamintlify dev. - Acceptance : 0 lien cassé, structure 5 sections visible en sidebar.
Agent 1.B — Override frontmatter MDX OpenAPI (~70 fichiers)
- Mission : remplacer les titres auto-générés illisibles par des titres FR clairs.
- Actions : pour chaque
.mdxsousapi-v2-reference/,api-ai-reference/,api-geocoding-reference/:- Ajouter frontmatter complet :
- Convention icônes : Properties =
home, Adverts =newspaper, Alerts =bell, AI =sparkles, GEO =map-pin, Sample =flask-conical.
- Ajouter frontmatter complet :
- Output : tous les
.mdxOpenAPI ont un frontmatter custom. - Acceptance :
grep -c '^title:'sur chaque fichier MDX OpenAPI = 1.
Agent 1.C — Snippets Mintlify réutilisables
- Mission : créer les snippets centralisés pour les contenus dédupliqués.
- Actions : créer
/snippets/:decision-matrix-property-vs-advert.mdx(le tableau §5 de la reco)cta-cle-test-gratuite.mdx(footer : “Clé test gratuite 1 semaine sur my.fluximmo.io”)banniere-llm-context.mdx(”🤖 Page LLM-ready disponible”)banniere-startups.mdx(encart discret early-stage)warning-city-deprecated.mdx(city ignoré → utiliser postalCode/inseeCode/department)warning-cycle-vie-alerte.mdx(perte historique sur recreate)
- Output : 6 snippets réutilisables.
- Acceptance : chaque snippet rendu en standalone via
mintlify dev.
Phase 2 — Concepts + Onboarding + Modèles (parallèle x3, ~1.5 jour)
Goal : poser les pages pédagogiques fondatrices (autonomie #1) avant d’enrichir les endpoints. Dépend de : Phase 1.Agent 2.A — Concepts (5 pages)
concepts/property-vs-advert.mdx— decision matrix (snippet) + diagramme Mermaid + cas d’usageconcepts/webhooks.mdx(refonte) — archi, IDs vs payload complet, samples webhook live, Mermaid pipelineconcepts/match-types-cycle-alerte.mdx—CREATED/MERGED/ADVERT_EVENT, perte historique sur recreate (warning gras), pas de backfill, eventsPRICE/REPUBLISHED/UNPUBLISHEDconcepts/filtres-communs.mdx—location/offer/price/habitation/meta.isTotallyOffline+ warningcityignoré (snippet)concepts/recherche-geographique.mdx— 4 modes (postalCode/inseeCode/departmentadmin +geoBoundingBox+geoDistance+geoShape+ multi-zones OR), contraintes (cf RECOMMENDATION §C.1), anti-patterns- Style : exemples > texte. Mermaid systématique.
Agent 2.B — Onboarding (4 pages)
introduction.mdx(réécrite) — vision FR-first depuis 2017, 0 mention proéminente Calendly, lien samples no-auth + clé test gratuitedemarrer/quickstart.mdx— 5 min sans appel : sample → clé test → 1er search (curl + Python + Node via<CodeGroup>)demarrer/sample-data.mdx— valoriser les 4 endpoints/v2/sample/*(no-auth) + bouton “Try it” Mintlify activéauthentification.mdx(réécrite) — clé test gratuite via my.fluximmo.io + clé prod, mention discrète email contact- Acceptance : un lecteur sans clé peut atteindre un sample no-auth en ≤ 2 clics.
Agent 2.C — Modèles Property / Advert
api-v2-reference/_api-models/property.mdx— schéma champs + descriptions + warningcity+meta.isTotallyOfflineclé prod + lien decision matrix (snippet)api-v2-reference/_api-models/advert.mdx— schéma champs + différences avec property + lien decision matrix- Source : DTOs réels dans
api_fluximmo_v2/src/modules/app/dto/(cf RECOMMENDATION §C.7).
Phase 3 — API Reference enrichie + EXEMPLES + VALIDATION LIVE (parallèle + Validator, ~2-3 jours)
Goal : enrichir chaque endpoint Search/Alerts/AI/GEO avec prose + exemples curated, et valider chaque exemple PROPERTIES search live contre l’API. Dépend de : Phase 1 + Phase 2. Bloquant : pré-requis #1, #2, #5.Agent 3.A — Enrichir Search Properties (full + lite + similar)
Ajouter prose au-dessus de l’OpenAPI block + section Exemples avec 6 exemples curated :- ★★ Combo standard :
postalCodeParis achat[FLAT, HOUSE](pas PROGRAM), prix 100-350k€, surface 30-110m²,isTotallyOffline=false, sortFIRST_SEEN_AT DESC, size 100 - Recherche par
department(ex: 13) location maison surface ≥ 80m² 3+ chambres - ★
geoDistancerayon 20 km autour d’une adresse géocodée - ★
geoBoundingBoxcarte interactive Paris - ★
geoShapePOLYGON quartier custom (Le Marais) - Multi-zones via
location: [{postalCode}, {postalCode}, ...]
searchAfterHash documentée.
Agent 3.B — Enrichir Search Adverts + tous les Alerts
- Search Adverts : 4 exemples (achat appart dpt, geoDistance autour métro, seller/agence, propertyFlxId)
- Alerts ADVERT CREATE : 3 exemples (chasseur dpt simple, +events
ADVERT_EVENT, multi-dpt) - Alerts PROPERTIES CREATE : 3 exemples
- Combo standard
match=[CREATED](défaut) - Dpt + isTotallyOffline=false
match=[CREATED] match=[CREATED, MERGED]en exemple AVANCÉ uniquement (ne pas mettre en avant)
- Combo standard
- Tous les autres alerts (LIST, GET, PATCH, DELETE, ACTIVATE, HISTORY) avec prose courte + cas d’usage
Agent 3.C — Enrichir AI / GEO / Sample
- AI :
estimate/property/lite+experimental/estimate— input/output, exemples appart Paris + maison province - GEO : préciser origine BAN/BANO Gouv (pas proprio Fluximmo) + exemples search/reverse/CSV
- Sample : valoriser les 4 endpoints, “Try it” actifs
⚠️ Agent 3.V — VALIDATOR (CRITIQUE — lancé après 3.A et 3.B)
Mission CRITIQUE : pour chaque exemple PROPERTIES search créé en Phase 3.A et 3.B, exécuter live + vérifier que les résultats respectent les filtres. Procédure par exemple :- Parser le payload JSON depuis le
.mdx POSTvershttps://api.fluximmo.io/v2/protected/properties/search(headerx-api-key)- Récupérer la réponse (jusqu’à
sizerésultats) - Vérifier filtre par filtre que chaque résultat respecte les contraintes (cf Annexe A)
- Émettre rapport
__validation_reports/<example_slug>.md - Bloquer le merge si ≥ 1 exemple échoue
__validation_reports/ à la racine doc :
- 1 rapport markdown par exemple
- 1 rapport agrégé
_summary.md
💡 Pourquoi un validator dédié : c’est la consigne explicite. Détecte en amont les exemples mal formés (impossible en review humain pur) et révèle de potentiels bugs API.
Phase 4 — Playbooks (parallèle x4, ~2 jours)
Goal : 8 playbooks orientés cas d’usage, réutilisant les exemples validés Phase 3. Dépend de : Phase 3 (exemples validés disponibles). Lancer 4 agents en parallèle, chacun produit 2 playbooks :Agent 4.A
playbooks/alerte-advert-departement.mdx— chasseur immo (use case #1)playbooks/search-properties-analytique.mdx— analytics Paris achat (use case #2)
Agent 4.B
playbooks/recherche-geographique-avancee.mdx— bbox / distance / polygon / multi-zones (★ feature distinctive)playbooks/replicate-bdd-adverts.mdx— sync continue marketplace
Agent 4.C
playbooks/track-price-changes.mdx— eventsPRICE/REPUBLISHED/UNPUBLISHED(alerte ADVERT)playbooks/estimer-un-bien.mdx— AVM AI lite
Agent 4.D
playbooks/geocoder-pour-search.mdx— chaîne BAN/BANO → search Fluximmoplaybooks/webhook-volume-architecture.mdx— RabbitMQ / SQS, idempotence, ack rapide, retry/DLX
- Goal (1 phrase, orienté outcome client)
- Scénario (qui je suis, ce que je veux)
- Étapes (
<Steps>Mintlify) avec curl + Python + Node (<CodeGroup>) - Diagramme Mermaid du flow
- Pièges fréquents (
<Warning>) - Liens vers concepts + endpoints API
Phase 5 — LLM-ready + Ressources + UI polish (parallèle x4, ~1.5 jour)
Goal : finaliser autonomie #2 (LLM) + ressources support + polish visuel. Peut démarrer en parallèle de Phase 4 (pas de dépendance forte).Agent 5.A — Page LLM-ready
llms-context.mdx— manuel (cf RECOMMENDATION §7.27.A) :- Identité Fluximmo 3 lignes
- Decision matrix condensée
- Schémas TS-like des DTOs (FilterProperty, FilterAdvert, FilterLocation, FilterPrice, FilterTypeHabitation, FilterMeta, SaveSearchPropertiesPayload, SaveSearchAdvertsPayload)
- Enums littéraux
- Limites strictes (size 25/100, max keywords 20, distance > 0)
- Match types & events
- 8 archetypes payloads JSON minifiés (issus de Phase 3 validés)
- Anti-patterns (city ignoré, GeoJSON [lon,lat] vs API , pas de backfill)
- Cible : 2 000–4 000 tokens
- Activer
llms.txt+llms-full.txtnatifs Mintlify dansmint.json
Agent 5.B — Ressources (5 pages)
ressources/faq.mdx— top 15 questions (collecter auprès du support)ressources/codes-erreur.mdx— codes 10001/10002/10003 + format réponse erreurressources/webhooks-livraison.mdx—x-webhook-key, retry 2+10×5min, DROP après ~50min, codes 200-205, SLO 30-50sressources/bonnes-pratiques.mdx— pagination, retry, idempotence, refetch, validation webhook par x-webhook-keyressources/limites-rate-limits.mdx— quotas (neutre, sans surpromettre)
Agent 5.C — Pages stratégiques (3 pages)
concepts/dvf-vs-fluximmo.mdx— comparatif honnête + DVF dispo sur demande dès aujourd’huiapi-reference/capabilities-sur-demande.mdx— DPE, similar, market analytics, properties analytics, agences, consumption (descriptif, no OpenAPI)ressources/startups-et-sur-mesure.mdx— discount sans %, qualif sur demande, 0 noms clients publics, études de cas anonymisées OK
Agent 5.D — UI polish
- Confirmer palette
#1E40AF/#10B981dansmint.json(raffinage Phase 1) - Ajouter Mermaid diagrammes (style Default Mintlify) dans :
concepts/webhooks.mdxconcepts/match-types-cycle-alerte.mdxconcepts/recherche-geographique.mdxplaybooks/replicate-bdd-adverts.mdxplaybooks/webhook-volume-architecture.mdx
- Activer API playground sur les 4 sample endpoints uniquement
- Vérifier dark mode lisible sur toutes les pages
Phase 6 — QA finale (parallèle x3, ~0.5 jour)
Goal : validation cross-platform + zéro régression avant release. Dépend de : tout.Agent 6.A — Link checker + structure
mintlify devlancé → vérifier 0 lien cassé- Vérifier que
mint.jsonvalide tous les paths référencés - Recompter les
.mdxorphelins (objectif : 0) - Test Lighthouse sur 5 pages représentatives → Performance ≥ 90, Accessibility ≥ 95
Agent 6.B — Re-validation exemples PROPERTIES
- Re-exécuter l’agent 3.V VALIDATOR sur tous les exemples PROPERTIES (incluant ceux dans les playbooks et
llms-context.mdx). - Garantit zéro régression depuis Phase 3.
Agent 6.C — User journeys cold-start
Simuler 3 parcours :- Découverte sans clé : depuis
/, atteindre un sample no-auth en ≤ 2 clics → succès copy-paste curl - Quickstart 5 min : suivre
demarrer/quickstart.mdxfrom scratch sur clé test → premier search OK - Génération payload via LLM : copier
llms-context.mdxdans Claude/ChatGPT, demander “alerte ADVERT achat appartement département 75 prix max 600k€” → vérifier que le LLM produit un payload valide (re-validate via agent 3.V)
- ✅ 0 lien cassé
- ✅ 100% des exemples PROPERTIES validés (Phase 3 + Phase 6)
- ✅ Les 3 user journeys passent
- ✅ Lighthouse Performance ≥ 90, Accessibility ≥ 95
- ✅ 0 mention proéminente Calendly avant la 3ᵉ page profondeur
- ✅ Decision matrix Property vs Advert accessible en ≤ 2 clics
Récap effort + parallélisation
| Phase | Agents parallèles | Durée séquentielle | Durée si parallèle | Bloquant |
|---|---|---|---|---|
| 1 | 3 | 3j | 1j | Pré-req #4, #6 |
| 2 | 3 | 4.5j | 1.5j | Phase 1 |
| 3 | 3 + Validator | 7j | 2-3j | Phase 2 + Pré-req #1, #2, #5 |
| 4 | 4 | 8j | 2j | Phase 3 |
| 5 | 4 | 6j | 1.5j | Phase 2 (partiel) |
| 6 | 3 | 1.5j | 0.5j | Tout |
| Total | — | 30j | ~8.5j calendaires | — |
Compression possible : Phase 5 démarre en chevauchement avec Phase 4 → 5-6j calendaires réalistes.
Critère “stop the line”
Bloquer la progression si :- Phase 3 Validator détecte ≥ 1 exemple PROPERTIES qui échoue → corriger l’exemple ou remonter un bug API
- Lighthouse Accessibility < 90 sur une page → corriger avant Phase suivante
- Un user journey échoue en Phase 6 → ne pas release
Annexe A — Spec technique de l’agent VALIDATOR (Phase 3.V & 6.B)
Inputs :- Liste des exemples à valider (extraits depuis tous les
.mdx— chercher les blocks```jsonà but “exemple search PROPERTIES”) - Clé API test (
FLUXIMMO_TEST_API_KEY) - Base URL API (
FLUXIMMO_API_BASE_URL)
- Parser le payload JSON
-
- Parser
response.results[] - Pour chaque result, vérifier filtre par filtre selon mapping ci-dessous
- Émettre rapport markdown
shapely pour la géométrie) :
| Filtre payload | Vérification sur chaque result |
|---|---|
filterProperty.location[].postalCode | result.location.postalCode == filter |
filterProperty.location[].inseeCode | result.location.inseeCode == filter |
filterProperty.location[].department | result.location.department == filter |
location[].locationCoordinate.location.geoDistance | plane_distance(filter.pin, result.location) <= filter.distanceKm (DistanceType=Plane côté code, pas Haversine) |
location[].locationCoordinate.location.geoBoundingBox | topLeft.lat ≥ result.lat ≥ bottomRight.lat ET topLeft.lon ≤ result.lon ≤ bottomRight.lon |
location[].locationCoordinate.location.geoShape POLYGON | point_in_polygon(result.lat, result.lon, filter.coordinates) (shapely ou ray-casting) |
filterProperty.offer[].type | result.offer.type ∈ filter |
filterProperty.price.initial.value.{min,max} | filter.min ≤ result.price.initial.value ≤ filter.max |
filterProperty.habitation.surface.total.{min,max} | filter.min ≤ result.habitation.surface.total ≤ filter.max |
filterProperty.habitation.bedroomCount.{min,max} | filter.min ≤ result.habitation.bedroomCount ≤ filter.max |
filterProperty.type[] | result.type ∈ filter |
filterProperty.meta.isTotallyOffline | result.meta.isTotallyOffline == filter |
location est un array de N>1 entries) :
→ result.location matche AU MOINS UNE des entries (OR logic, cf RECOMMENDATION §C elasticimmo bool.should)
Output :
__validation_reports/<example_slug>.md(1 par exemple)__validation_reports/_summary.md(agrégé : passes / fails / warnings)- Exit code != 0 si ≥ 1 fail (pour bloquer CI/merge)
Pour démarrer l’exécution
Une fois ce plan validé :- Créer la branche
feature/refonte-doc-v2sur le repo doc - Confirmer pré-requis #1 + #2 + #5 (clé API test + URL base)
- Lancer Phase 1 (3 agents en parallèle dans un seul message Agent)
- Attendre Phase 1 → lancer Phase 2 (3 agents)
- Etc.
Référence spec complète : RECOMMENDATION_IMPROVE_DOC.md à la racine du repo doc.

