DIRECTEUR CRÉATIF  CONFIDENTIEL  v4.0

Guide DC — FRACTILIS

📅 Mai 2026 👤 Foza · Foza Studio · Bénin 🔒 Accès Architecte uniquement

Documentation exhaustive pour la direction, la maintenance et l'évolution de la plateforme FRACTILIS. Ce guide fusionne l'architecture technique complète, les procédures opérationnelles et les protocoles de crise. Garder confidentiel.

🏗 Architecture de la Plateforme

FRACTILIS est une Single Page Application multi-fichiers en HTML/CSS/JS vanilla (sans framework). Chaque page est autonome mais partage des fichiers communs. Le backend est entièrement Firebase — pas de serveur dédié.

🌐 Frontend
HTML5 + CSS3 + JS ES6 vanilla. Fonts : Syne (titres) · DM Sans (corps) · DM Mono (code). Pas de framework — délibérément pour la portabilité et la légèreté.
☁ Backend Firebase
Auth : Email/password · persistance LOCAL
Firestore : Base de données temps réel
Hosting : CDN fractilis.web.app
Images : Cloudinary (cloud davzicbph)

Accès Hub Architecte

1
Firebase Auth : fozadev@gmail.com → connexion normale
2
Code DC : FozaStudio2026 — demandé à l'entrée du Hub Architecte
⚠ Double contrôle d'accès
Le Hub applique Firebase Auth + code PIN avant d'afficher les 16 panneaux d'administration. Changer le code PIN tous les 3 mois.

Ordre de chargement des scripts (critique)

1. fractilis-firebase.js   ← TOUJOURS en premier (expose window.db / window.auth)
2. fractilis-bg.js         ← dépend de window.db pour Firestore (slideshow + CSS)
3. fractilis-nav.js        ← dépend de window.auth (menu, Oracle, état connexion)
4. fractilis-mailer.js     ← uniquement sur architecte.html
5. NexusRouter.js          ← en dernier (vérifie auth + rang avant affichage)
🚨 Firebase jamais dans <head> avec defer
Firebase SDK doit être synchrone. Si chargé en async/defer, window.db est undefined quand les autres scripts s'exécutent → tout plante silencieusement.

📁 Fichiers & Dépendances

Fichiers système (tous présents dans public/)

FichierRôlePages
fractilis-firebase.jsInit Firebase SDK. Expose window.db, window.auth. Fire l'event fractilis-firebase-ready.Toutes
fractilis-nav.jsMenu hamburger, Oracle flottant, auth state, groupes WA collapsibles, responsive mobileToutes
fractilis-bg.jsSlideshow fond d'écran plein écran, CSS transparence globale, CSS mobile, warning portraitToutes
fractilis-mailer.jsEnvoi emails/notifications via Google Apps Script (FRACTILIS_AppsScript.js)architecte.html
NexusRouter.jsGuard navigation : vérifie auth + rang minimum via data-requires-auth et data-min-levelPages protégées
shared.cssDesign system global : variables CSS, composants communs, galerie, cardsToutes
sw.jsService Worker offline/cache. Bypass Cloudinary, cdnjs, API externesAutomatique (racine)
config.jsConfig Firebase (apiKey, projectId…). Exposition publique normale — protégé par règles Firestore.Toutes
NexusHub.jsAncien système de navigation (remplacé par fractilis-nav.js). À supprimer des pages qui le chargent encore.Legacy

Bibliothèques CDN (aucune installation)

LibUsageSource
Firebase v9 compatAuth + Firestoregstatic.com
Leaflet.js 1.9.4Carte interactive Nexuscdnjs
Leaflet.draw 1.0.4Dessin vectoriel sur cartecdnjs
vis.js NetworkGraphe relations + arbre dynastiquecdnjs
Three.js r128Viewer 3D (.glb/.gltf)cdnjs
Cropper.js 1.5.12Recadrage photos galeriepublic/assets/ (local)
Groq SDKOracle IA, génération quêtes/votesAPI distante
ℹ Cropper.js local obligatoire
Cropper.js est bloqué par la CSP si chargé depuis cdnjs. Il doit être dans public/assets/cropper.min.js. Exécuter .\download_cropper.ps1 si absent.

🔥 Firebase & Firestore

Collections Firestore — carte complète

CollectionStructure cléQui écrit
users/{uid}role, niveau, points_merite, academy_exp, email, pseudo, displayName, last_seen, rang_iconeAuth system + DC
fnx/entriesArticles Forge (JSON stringifié)FORGE.html
fnx/kanbanColonnes Kanban FORGEFORGE.html
fnx/canonDécisions canon validéesarchitecte.html
fnx/map_dataCarte Nexus {shapes, layers, config}FORGE.html
fractilis_lore/{id}nom, type, statut (proposition/canon/quarantine), auteur_uid, votes, coherence_feedbackresonateur.html + DC
fractilis_quetestitre, description, pole, difficulte, bounty_pm, statut, rang_minimum, source, numarchitecte.html
fractilis_ideesstatut (en_attente/validee/refusee/escalade), auteur_uid, titre, votes_pour, notification_envoyeeresonateur.html
votesquestion, options, type, status (actif/clos), expiresAt, num, participantsarchitecte.html
votes/{ideaId}_{userId}userId, ideaId, weight (1–5 selon rôle), role, dateMembres
notificationsuserId, type, message, lu, createdAtSystème auto
presence/{uid}uid, pseudo, role, status (disponible/concentre/afk), page, last_seenChacun pour soi
config_dc/secretsgroq_key, openai_key, admin_pwd_hashDC uniquement
config_dc/publicga_measurement_idDC uniquement
fractilis_devlogstitre, contenu, poles, progression, notification_envoyee, createdAtarchitecte.html
fractilis_courstitre, role, actif, notification_envoyee, createdAtarchitecte.html
fractilis_meta/gallerygallery:[{url, cropX, cropY, label, addedAt}]architecte.html
fractilis_meta/economytotal_pm_distribues, global_rate, global_multiplierAuto
fractilis_meta/progressionglobal, lore, tech, visuel, audio (valeurs 0–100)architecte.html
fractilis_meta/ai_project_memorymemory: String (contexte IA persistant)Oracle IA
fractilis_boutiquetitre, description, categorie, cout_pm, stock, actif, rang_minimum, usage, iconearchitecte.html
fractilis_interviewscandidat_uid, questions, statut, source, createdByarchitecte.html
fractilis_candidatures/{id}nom, email, motivation, pole, score_ia, statut, datecandidature.html
hub_visuel/boardnodes:[{id, type, x, y, data}], connections:[{from, to}]architecte.html
forge_validations_pendingtype, titre, auteur_uid, statut, dataFORGE.html
notifs_canon/{id}uid, titre, type (canon/promotion_forge), vu, dateAuto
bcast_historytype, titre, destinataires, createdAtarchitecte.html

Accéder à Firestore directement

1
console.firebase.google.com → Projet "fractilis" → Firestore Database
2
La console bypasse les règles Firestore — tu peux tout lire/écrire même les champs normalement restreints
3
Pour modifier : cliquer sur la collection → document → crayon. Les changements sont en temps réel.

Variables d'environnement importantes

// Dans config.js (public, normal)
const firebaseConfig = { apiKey: "...", projectId: "fractilis", ... };

// Dans Firestore config_dc/secrets (privé)
{ groq_key: "gsk_...", openai_key: "sk-...", admin_pwd_hash: "sha256..." }

// Dans fractilis-bg.js
window.CLOUDINARY_CLOUD_NAME    = 'davzicbph';
window.CLOUDINARY_UPLOAD_PRESET = 'fractilis_gallery';

// Code DC (à changer tous les 3 mois)
FozaStudio2026

🚀 Déploiement

Déploiement standard

# Depuis la racine du projet (PowerShell)
cd C:\...\FRACTILIS_Final

# Hosting uniquement (le plus courant)
firebase deploy --only hosting

# Hosting + règles Firestore
firebase deploy --only hosting,firestore:rules

# Tout (hosting + firestore rules + indexes)
firebase deploy

Forcer la mise à jour du Service Worker

// Dans sw.js, incrémenter le numéro de version
const CACHE_NAME = 'fractilis-v6'; // était v5 → maintenant v6
// Les visiteurs reçoivent le nouveau SW à leur prochain chargement

Rollback d'urgence

# Voir les déploiements précédents
firebase hosting:releases:list --limit 10

# Revenir à la version précédente
firebase hosting:rollback
ℹ Wrangler / Cloudflare
wrangler.toml est présent mais NON utilisé. FRACTILIS utilise Firebase Hosting exclusivement. Ne jamais déployer via Wrangler — ça casserait Firebase Auth.

👥 Membres & Rangs

Hiérarchie complète des rôles

NiveauRangIcôneAccèsPoids vote
1Recrue / Initié◎Accueil, Hall of Fame, Boutique, Academy×1
2Membre◈+ Résonateur, Chambre des Votes, Forge (lecture)×2
3Artisan / Compilateur⬡+ Arsenal IA, Atelier, Compendium×3
4Concepteur✦+ Forge complète, Lore L2, Propositions×3
5Forgeron◉+ Quêtes N5, Badge Honoraire×4
6Maître⬟+ Référendum, Siège Conseil, Guide DC×4
7Architecte / DC◈◈Tout — Hub Architecte complet×5
⚠ Valeurs valides pour le champ role
lecteur · recrue · membre · artisan · concepteur · forgeron · maitre · architecte · admin · banni
Toute autre valeur casse le RBAC. Le champ doit être exactement en minuscule sans accent (sauf maitre sans accent).

Promouvoir un membre

1
Hub Architecte → Membres → trouver le membre → modifier role et niveau
2
Ou directement : Firebase Console → Firestore → users/{uid} → modifier les champs role ET niveau
3
Optionnel : Diffusion → notification WhatsApp de félicitations

Bannir un membre

// Firestore → users/{uid}
{ "role": "banni", "banned": true, "ban_reason": "...", "ban_date": "2026-05-01" }
// ET Firebase Console → Authentication → Désactiver le compte

★ Économie & Points Mérite (PM)

Sources de PM

SourcePMDéclencheur
Quête N1 complétée10–30Auto (bounty_pm)
Quête N3 complétée60–150Auto
Quête N5 complétée300–500+Validation DC
Idée canonisée (Résonateur)+50Auto à canonisation
Attribution manuelle DCLibreHub Architecte → Membres
Bonus événementVariableglobal_multiplier dans fractilis_meta/economy

Multiplicateurs économiques

// fractilis_meta/economy
{
  "global_rate": 1.0,        // Taux de base
  "global_multiplier": 1.5,  // Événement actif (×1.5 PM) → modifier ici pour un event
  "total_pm_distribues": 4280
}

Progression automatique → rangs

La fonction getRang() dans config.js calcule le rang à partir de points_merite. Les accès se débloquent automatiquement. Seuils approximatifs :

Recrue : 0 PM Membre : 50 PM Artisan : 150 PM Concepteur : 350 PM Forgeron : 700 PM Maître : 1200 PM

RevShare — Opération irréversible

🚨 PM cristallisés = jamais remboursés
Quand un membre achète un article RevShare (Bronze 500PM / Argent 1000PM / Or 2000PM), les PM sont définitivement cristallisés. Un contrat officiel doit être généré et archivé. Lister tous les détenteurs RevShare dans un tableur séparé.

⚔ Gestion des Quêtes

Cycle de vie

brouillon→ active→ en_cours→ soumise→ validee / rejetee

Créer une quête manuellement

1
Hub Architecte → Quêtes → onglet ✏ Créer manuellement
2
Remplir : Titre · Description · Pôle · Difficulté N1–N5 · Délai (jours) · PM bounty · PM bonus · EXP · Rang minimum
3
Publier → ID Q-XXXX généré automatiquement → statut = "active" → visible immédiatement dans tableau_quetes.html

Niveaux et calibration

NiveauDuréePM bountyLivrable type
N1 — Initiation1–3 jours10–30Recherche, mockup, texte court
N2 — Standard3–7 jours30–60Composant, scène, asset simple
N3 — Avancé1–2 semaines60–150Système, chapitre, set d'assets
N4 — Expert2–4 semaines150–300Feature majeure, arc narratif
N5 — Légendaire1–3 mois300–500+Architecture, direction, livrable critique

🗳 Votes & Gouvernance

Types de vote

TypeDuréeUsagePoids vote
Express24hDécisions rapidesStandard
Ouvert72hDécisions standardPondéré par rôle ×1–×5
Ferme72hOptions fixes, pas de débatPondéré
Grand Débat7 joursDécisions majeuresPondéré

Gérer un véto

Un véto membre gèle le vote 48h. Hub Architecte → Votes → Vétos actifs. Tu peux lever un véto si la décision est urgente (bouton "Lever le veto") ou si le véto n'est pas fondé. Documenter la décision dans le devlog.

⚠ Index Firestore manquants — erreur fréquente
Si erreur "The query requires an index" : Firebase Console → Firestore → Index → créer l'index composite suggéré dans le lien d'erreur. Tous les tris sont faits côté client dans le code actuel pour éviter ce problème.

💡 Résonateur & Creuset

Pipeline complet

1
Membre soumet une idée dans resonateur.html → analyse IA de cohérence canon (Groq)
2
Statut initial : proposition ou quarantine (si hors-canon). Notification WhatsApp envoyée au groupe studio.
3
Concepteurs votent (poids ×1 à ×5 selon rôle). Score pondéré calculé.
4
Architecte ouvre le creuset des resonnances.html → Vue Double (Résonateur gauche · Forge droite)
5
Actions : CANONISER (+50 PM à l'auteur, statut = canon, exportable Godot) · FORGER (bascule dans Forge pour édition) · REJETER (avec motif)

Actions DC sur le Résonateur

Hub Architecte → Résonateur → idées en attente :

Réinitialiser les votes d'une idée

// Si les votes ne se comptent pas :
// 1. Vérifier collection votes/{ideaId}_{userId} dans Firestore
// 2. Vérifier règle Firestore sur collection "votes"
// 3. En local : localStorage.removeItem('res_votes') pour réinitialiser

📋 Candidatures

Toutes les candidatures arrivent dans Firestore fractilis_candidatures ET dans le Google Sheet via Apps Script.

Workflow de traitement

DécisionActionDéclencheur
REJETERStatut = "rejeté" + WA pré-rédigé (wa.me/NUMERO?text=…)Hub Architecte → Recrutement
ENTRETIENWA avec invitation dans La TavernePour profils à évaluer
ACCEPTERWA avec lien groupe du pôle + message de bienvenueHub Architecte
PROMOUVOIRWA + accès Notion + rang Concepteur directProfils exceptionnels

Google Apps Script

// Google Sheets → Extensions → Apps Script → FRACTILIS_AppsScript.js
// Remplir SHEET_URL et DC_WA_NUMBER en tête de fichier
// Déployer → App Web → "Tout le monde (anonyme)"
// Copier l'URL dans script_onboarding.js (variable APPS_URL)
// Déclencheur : sendWeeklyDigest → Lundi → 8h–9h
// Tester : exécuter testEmails() depuis Apps Script

🔥 La Forge (Worldbuilder OS)

La Forge (FORGE.html, 4600+ lignes) est l'éditeur worldbuilding central. Elle contient : Carte Nexus · Assistant IA Oracle · Arbre dynastique · Graphe de relations · Chronologie · Kanban · Générateurs · Export Godot · Viewer 3D · Panel Équipe.

Modules de La Forge

📖 Lore / Personnages
Créer/éditer personnages, lieux, factions, artefacts. Stocké dans fnx/entries. Statuts : proposition → canon → exportable Godot.
≡ Chronologie
Timeline filtrée par ère/type. Cliquer "Tout" après un filtre peut vider l'affichage — cliquer à nouveau résout. Données dans Firestore fnx/entries.
📊 Graphe & Arbre
vis.js Network. Connexions entre entités. Si le graphe ne s'affiche pas : vérifier que vis.js est chargé depuis cdnjs (CSP).
📋 Kanban
Colonnes de gestion de production. Données dans fnx/kanban. Drag & drop natif.

Lore L2 (secret)

Activer L2 : cliquer badge "L2" en haut de la Forge → entrer FozaStudio2026 → les sections D8/D13/D14/D15 deviennent visibles.

🚨 L2 = révélations clés du jeu
D13 (Mira dans l'Axion), D14 (Veyra piégée), D15 (Dirigeants responsables) sont les révélations narratives centrales. Les exposer prématurément détruit l'expérience. Notifier les Concepteurs si tu changes le code L2.

Corpus / Documents

Niveaux d'accès documents : public · l1 · l2 · arch_only. Pour ajouter un document long : stocker dans Google Drive → coller le lien dans la Forge. Champ niveau_acces dans Firestore.

🗺 Carte Nexus

Carte interactive Leaflet.js. Chaque calque (Districts, Fractures, Biomes…) est toggleable indépendamment.

Usage

Si la carte ne s'affiche pas

// Console : typeof L doit renvoyer "object" (Leaflet chargé)
// #body-map doit avoir une hauteur CSS définie
// Appeler _map.invalidateSize() après un changement de layout
// Leaflet.draw requiert Leaflet chargé EN PREMIER (ordre scripts)

🎓 Academy

Classes de contenu

Classe 1 — Tous les membres
Modules de base. Accessible rang Initié+. role: 'membre' ou plus suffit.
Classe 2 — Concepteurs+
Modules avancés. Nécessite role: 'concepteur' ou 'architecte' exactement dans Firestore. academy-engine.js lit data.role.

Membre reconnu "Initié" malgré son rang

L'Academy lit data.role uniquement. Si le doc Firestore contient grade ou rang_studio au lieu de role, le membre sera Classe 1. Fix : s'assurer que le champ est role (pas grade ni rang).

Tests de vérification

Hub Architecte → Vérification → deux modes :

🖼 Galerie & Médias

Pipeline upload d'image

1
Hub Architecte → Galerie → 📁 Choisir un fichier (TOUJOURS un fichier local — pas d'URL externe, le CORS bloque le recadrage)
2
Recadrer avec Cropper.js → choisir le mode → Appliquer le cadrage (les coordonnées cropX/cropY sont calculées)
3
Enregistrer → upload Cloudinary → URL + cropX/cropY stockés dans fractilis_meta/gallery
4
Le slideshow fond d'écran se met à jour en temps réel sur toutes les pages via onSnapshot

Cloudinary — config

Cloud name : davzicbph
Upload preset : fractilis_gallery (unsigned — pas de signature requise)
Dossier upload : gallery/
Console : cloudinary.com/console → Settings → Upload → Upload presets

Limite Firestore (stockage base64)

Sans Cloudinary : images compressées max 800×600px/80% JPEG avant stockage. Limite : 1MB par document Firestore. Au-delà de ~15 images en base64, migrer vers Cloudinary obligatoire.

💎 Boutique

Initialiser les 28 articles

Hub Architecte → Boutique → bouton "Initialiser les 28 articles". Une seule fois (ou si la boutique est vide).

Catégories et articles par défaut

⚖ Gouvernance (5)
Droit de Vote · Proposition Agenda · Veto Symbolique · Siège Conseil · Référendum Studio
🎭 Identité (5)
Titre Personnalisé · Couleur de Pseudo · Surnom Lore · Avatar Nexus · Carte Collector
⚡ Pouvoir (4)
Accélérateur de Rang · Slot Quête Prioritaire · Extension Délai · Badge Concepteur Honoraire
📜 Lore (7)
PNJ · Arme · Easter Egg · Scène · Codex · Lieu · Dialogue Personnage Principal
🎮 Technique (4)
Playtest VIP · Tutoriel Godot · Revue de Code · Session Pair Programming
💰 RevShare (3)
Bronze (0.25%) · Argent (0.5%) · Or (1%) — IRRÉVERSIBLES

Gestion du stock

stock = null → illimité. stock = 0 → épuisé. stock = n → décrémenté automatiquement à chaque achat.

⚙ Arsenal IA

Bibliothèque de prompts par catégorie pour les outils IA utilisés en production. Accessible aux Concepteurs+ via La Forge ou l'outil dédié.

Outils principaux

🤖 Oracle Nexus
Assistant IA contextuel connecté au lore canon. Accessible via bouton flottant sur toutes les pages.
✍ Générateur Quêtes
Génère des quêtes calibrées via Groq selon le pôle et la difficulté sélectionnés.
🗳 Générateur Votes
Génère des questions de vote pertinentes selon le contexte du projet.

Si la clé Groq est expirée

// 1. console.groq.com → générer une nouvelle clé
// 2. Firestore → config_dc/secrets → groq_key = "gsk_nouvelle_cle"
// 3. Tester : ouvrir Oracle dans La Forge → poser une question
// Si toujours muet : vérifier aussi FRACTILIS_AppsScript.js → variable GROQ_KEY

🎮 Export Godot 4

Seuls les articles avec statut: 'canon' sont inclus dans l'export.

// JSON généré : data_export.json → placer dans res://data/ de Godot
// DataHandler.gd charge via ResourceLoader.load("res://data/data_export.json")

// API Godot :
DataHandler.get_entity("uuid")
DataHandler.get_by_type("arme")

// Structure JSON exportée :
{
  "id": "uuid",
  "nom": "Eran Kalen",
  "type": "personnage",
  "l1": "Texte public (Layer 1)",
  "l2": "Révélation secrète (Layer 2 — non exporté en production)",
  "stats": { ... }
}
⚠ L2 jamais exporté en production
Le texte narratif L1/L2 est séparé dans le JSON. S'assurer que l'export Godot de production exclut le champ l2.

✅ Checklist Mensuelle DC

✅ À faire chaque mois
  • ☐ Publier 1 devlog avec état d'avancement réel et % progression
  • ☐ Traiter les idées en attente au Résonateur (<2 semaines de délai)
  • ☐ Vérifier les candidatures en attente → traiter ou archiver
  • ☐ Clôturer les quêtes expirées / prolonger si justifié
  • ☐ Mettre à jour fractilis_meta/progression avec les vrais %
  • ☐ Faire le bilan PM distribués vs objectifs du mois
  • ☐ Vérifier les limites Firebase Spark (Usage and billing)
  • ☐ Sauvegarder les données importantes (Export JSON depuis architecte)
  • ☐ Vérifier les contrats RevShare signés et archivés
  • ☐ Tester testEmails() dans Apps Script
  • ☐ Contrôler le Google Sheet candidatures
  • ☐ Mettre à jour Hall of Fame si nouveaux membres notables
  • ☐ Vérifier que les Firebase Rules sont correctes

Modifier la progression globale

// Firestore : fractilis_meta/progression
{
  "global": 18,   // % affiché sur l'index et dans les stats live
  "lore": 35,     // % pôle Narration
  "tech": 12,     // % pôle Technique
  "visuel": 22,   // % pôle Visuel
  "audio": 5,     // % pôle Audio
  "studio": 10    // % organisation studio
}
// Alternative : triple-clic sur ◈ en footer de progression.html → FozaStudio2026

🔧 Dépannage Complet

❌ "Missing or insufficient permissions"

Cause : Collection non listée dans firestore.rules ou utilisateur sans le bon role.

Fix : Vérifier firestore.rules → ajouter une règle pour la collection → firebase deploy --only firestore:rules

❌ "The query requires an index"

Cause : where + orderBy sur plusieurs champs sans index composite Firestore.

Fix : Cliquer le lien dans le message d'erreur → Firebase Console → créer l'index. Ou utiliser le tri côté client.

❌ Cropper.js / "Cropper is not defined"

Fix : .\download_cropper.ps1 depuis la racine → vérifie que public/assets/cropper.min.js existe → redéployer.

❌ Images galerie noires / bloquées

Cause 1 : Service Worker intercepte Cloudinary. Fix : vérifier res.cloudinary.com dans BYPASS_PATTERNS de sw.js + incrémenter CACHE_NAME.

Cause 2 : base64 trop lourde. Fix : configurer Cloudinary.

❌ Hub Architecte bloqué malgré être DC

Fix : Firebase Console → users/{ton_uid} → champ role = exactement architecte (minuscule, pas de majuscule)

❌ Firebase ne se connecte pas

DevTools → Application → Local Storage → clé fnx_e doit exister. window.FIREBASE_READY doit être true. L'autosave fonctionne en localStorage même sans Firebase.

❌ NexusHub.js — SyntaxError "expected expression got '<'"

Cause : NexusHub.js n'existe pas → Firebase retourne une page 404 HTML → le navigateur essaie de l'exécuter comme JS.

Fix : Vérifier que NexusHub.js est dans public/. Ou supprimer la balise script qui le charge.

❌ Boutique vide après déploiement

1. Hub Architecte → Boutique → Initialiser les 28 articles (une seule fois). 2. Vérifier la syntaxe JS (apostrophes typographiques dans les strings). 3. Vérifier que mainContent n'est pas caché par l'auth wall.

❌ Fond d'écran (slideshow) absent

1. Vérifier que des images sont dans la Galerie (Hub Architecte). 2. Console : window.db doit être défini. 3. Vérifier l'ordre des scripts (fractilis-firebase.js avant fractilis-bg.js).

Activer le mode debug

// Sur n'importe quelle page : Ctrl + Shift + D
// → Panneau debug (coin bas gauche) avec état Firebase, auth, heure

// Depuis la console navigateur :
console.log('DB:', !!window.db, 'Auth:', !!window.auth, 'Ready:', window.FIREBASE_READY)
window.fracBgReload()   // Forcer rechargement slideshow fond
loadArticles && loadArticles()  // Forcer rechargement boutique

🛡 Sécurité

Rotation des mots de passe — tous les 3 mois

Le code DC FozaStudio2026 est hardcodé dans plusieurs fichiers. Pour le changer :

// Fichiers à modifier :
architecte.html     → variable ADMIN_PWD
progression.html    → triple-clic ◈ footer
Hall of Fame.html   → triple-clic ◈ footer
FORGE.html          → variable L2_PASSWORD (code L2 distinct)
guide_dc.html       → (ce document — section sécurité)

// Notifier les Concepteurs du nouveau code L2.

CSP — Content Security Policy

Définie dans firebase.json → headers. Si une ressource externe est bloquée :

// Ajouter dans la directive appropriée de firebase.json
"script-src": "... https://nouveau-domaine.com"
"connect-src": "... https://api.nouveau-service.com"
// Puis : firebase deploy --only hosting

Règles Firestore recommandées

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isArchitecte() {
      return request.auth != null && (
        get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'architecte'
        || get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'admin'
      );
    }
    function level() {
      return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.niveau || 0;
    }
    // Forge — lecture membres, écriture concepteurs+
    match /fnx/{doc} {
      allow read: if request.auth != null;
      allow write: if request.auth != null && level() >= 4;
    }
    // Lore — lecture publique, canonisation DC
    match /fractilis_lore/{id} {
      allow read: if true;
      allow create: if request.auth != null;
      allow update: if isArchitecte();
    }
    // Users — chacun lit/modifie le sien, DC modifie tous
    match /users/{uid} {
      allow read: if request.auth != null;
      allow write: if request.auth.uid == uid || isArchitecte();
    }
  }
}

Sauvegardes

// Export manuel depuis Hub Architecte → Export → JSON/Markdown/HTML
// Ou Firebase Console → Firestore → Exporter (plan Blaze requis pour export auto)
// Fréquence recommandée : mensuelle minimum
🚨 NE JAMAIS
  • Pousser des clés API dans un dépôt Git public
  • Mettre des données sensibles dans public/ (accessible par URL)
  • Partager le code DC à des non-Architectes

🚨 Gestion de Crise

🚨 Site cassé après déploiement
1
firebase hosting:rollback depuis PowerShell
2
Identifier les fichiers modifiés dans ce déploiement
3
Corriger localement + node --check fichier.html + redéployer
🚨 Membre malveillant / comportement problématique
1
Firebase Console → Authentication → Désactiver le compte immédiatement
2
Firestore → users/{uid} → role = "banni"
3
Documenter la raison (date, uid, comportement)
4
Diffusion si nécessaire — message sobre, sans détails
🚨 Clé GROQ compromise
1
Révoquer immédiatement sur console.groq.com
2
Générer une nouvelle clé
3
Mettre à jour Firestore : config_dc/secrets → groq_key ET FRACTILIS_AppsScript.js → GROQ_KEY
4
Vérifier les logs Groq pour des appels non autorisés
⚠ Limite Firebase Spark
Plan gratuit : 50k lectures/jour · 20k écritures/jour · 1GB stockage Firestore · 10GB hosting/mois. Si tu approches les limites : activer alertes dans Firebase Console → Usage and billing. Solution : passer au plan Blaze (pay-as-you-go).

🔗 Liens Admin Essentiels

📖 Glossaire FRACTILIS

TermeDéfinition
La FractureÉvénement fondateur du 18 novembre 2047. Point de départ de la timeline FRACTILIS.
Le NexusVille centrale de l'univers FRACTILIS, divisée en 7 districts.
AxionÉnergie primordiale libérée par la Fracture. Source de toute magie/technologie Magikpunk.
ÉchoEntité issue de la Fracture. N'obéit pas aux lois physiques normales.
OmégaLes 6 failles dimensionnelles majeures créées par la Fracture.
MagikpunkGenre esthétique de FRACTILIS : magie organique + technologie.
CanonCode : statut:'canon'. Élément validé DC, exportable Godot.
L1 / L2Layer 1 (lore public) / Layer 2 (lore secret, Maître+ uniquement).
DCDirecteur Créatif. Architecte de la plateforme et du projet.
fnxPréfixe de toutes les collections Forge dans Firestore.
PM / MéritesPoints de Mérite. Monnaie de progression et d'investissement des membres.
RésonateurInterface de soumission d'idées. Collection Firestore : fractilis_lore.
CreusetInterface de fusion Résonateur ↔ Forge. Bridge de validation.
DataHandler.gdAutoload Godot 4 qui charge et expose data_export.json.
Eran KalenPersonnage central du lore. Voir FRACTILIS_COMPENDIUM_ABSOLU.html.
Oracle NexusAssistant IA flottant, contextualisé au lore canon via Groq.
Hub ArchitectePanneau d'administration complet (architecte.html). Accès DC exclusif.

📝 Changelog Plateforme

v4.0 — Mai 2026

v3.0 — Avril–Mai 2026

v2.0 — Mars 2026

v1.0 — Janvier 2026

◈ GUIDE DC · FRACTILIS · Foza Studio · Bénin · v4.0 · Mai 2026
Document confidentiel — usage Directeur Créatif exclusivement