Confrontation Audit -- dashboard-33800
Date : 15/02/2026
Status : IMPLEMENTEE
Auditeur senior : Claude Opus 4.6
Methode : Lecture integrale des 3 rapports d'audit independants, verification croisee sur le code source pour arbitrage des contradictions.
Resume executif
| Metrique |
Valeur |
| Findings confirmes (2-3 passes concordantes) |
18 |
| Findings uniques (1 seule passe) |
18 |
| Faux positifs elimines |
5 |
| Contradictions resolues |
4 |
| Total findings definitifs |
36 (sur 90 bruts cumules) |
Les 3 passes avaient des angles differents :
- Pass 1 : Navigation, CSS, hardcoding, JavaScript, architecture (42 findings)
- Pass 2 : Securite Bash, injection de commandes, gestion d'erreurs, robustesse SSH (24 findings)
- Pass 3 : Integration, contrats inter-services, credentials, deploiement (24 findings)
La convergence la plus forte concerne l'exposition de credentials en clair (unanime, 3 passes), la fragmentation de la navigation (2 passes), l'absence de set -e / gestion d'erreurs (2 passes), les IPs hardcodees (2 passes), et StrictHostKeyChecking=no (2 passes).
Findings CONFIRMES (2-3 passes concordantes)
C-01 : Credentials en clair dans le HTML deploye sur O2switch (public)
- Confirme par : Pass 1 (F3.3 implicite) + Pass 2 (F01, F02) + Pass 3 (F-01)
- Severite definitive : BUG CERTAIN
- Description consolidee : Les pages
secrets.html (04-secrets.sh) et endpoints.html (05-endpoints.sh) contiennent en clair : mots de passe SSH (MyUlia75$w), mots de passe services (ntfy33800, 33800admin, d9fx-RNEz-xfK(), aE1RmUsd198cTt, oIoIlGGh6t4CDBLT), tokens API (glpat-yaowLwWBJhXfzJEC8UBC, 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, ptr_8B9+nxAyk...), cles Mailjet (0e24bea8cb588b742cccf75b34a253b1 / 3cbedc00ad58e9660585af9a5b73767d). Ces fichiers HTML sont pousses vers O2switch via git add -A && git push. Le .gitignore ne les exclut PAS. Le dashboard est accessible a https://dashboard.nowhere84.com.
- Impact : Compromission complete de l'infrastructure si le dashboard est accessible sans authentification.
- Priorite de correction : CRITIQUE (P0)
C-02 : 4+ systemes de navigation desynchronises
-
Confirme par : Pass 1 (F1.1, F1.2, F1.3, F1.4) + Pass 3 (F-18)
-
Severite definitive : BUG CERTAIN
-
Description consolidee : Il existe au minimum 4 sources de verite pour la navigation (Pass 1 en a identifie 4, Pass 3 en a identifie 5 en comptant templates.sh). Les navigations divergent : certaines pages sont presentes dans une nav et absentes des autres. Resultat : des pages sont orphelines (claude.html, architecture.html) et l'UX est inconsistante.
Sources identifiees :
_common.sh gen_header() : 14 liens
01-index.sh _gen_header() : 17 liens
nav.js : 18 liens
templates.sh html_header() : 11 liens (identifie par Pass 3 uniquement)
generate.sh generate_header() : 14 liens (identifie par Pass 3 uniquement)
- Navigations inline hardcodees dans chaque module
-
Impact : Pages inaccessibles selon la page de depart, UX cassee, maintenance impossible.
-
Priorite de correction : CRITIQUE
C-03 : Variables CSS non definies cassent le rendu visuel
- Confirme par : Pass 1 (F2.3) + Pass 2 (F09 mentionne l'inconsistance de ports mais pas CSS)
- Severite definitive : BUG CERTAIN
- Description consolidee : 14+ variables CSS sont utilisees dans les modules (--bg-secondary, --bg-tertiary, --border-color, --text-primary, --text-secondary, --accent-blue, --accent-green, --accent-orange, --accent-red, --bg-hover, --bg-main, --text-dim, --card-bg) alors que style.css ne les definit pas. Les proprietes CSS qui les referent sont ignorees par le navigateur, causant des fonds transparents, texte invisible, ou bordures manquantes.
- Impact : Rendu visuel degrade sur les pages ai-tools, models, claude, ai-jobs.
- Priorite de correction : HAUTE
Note : Seule la Pass 1 a fait l'inventaire exhaustif des variables manquantes. La Pass 2 et Pass 3 ne les ont pas verifiees (hors scope). Ce finding est neanmoins confirme comme BUG CERTAIN car l'evidence technique est sans ambiguite.
C-04 : IPs hardcodees dans le code des scripts
- Confirme par : Pass 1 (F3.1, F3.2, F3.3) + Pass 2 (F09) + Pass 3 (F-16 partiel)
- Severite definitive : BUG PROBABLE
- Description consolidee :
19-ai-orchestrator.sh ligne 13 contient http://192.168.1.12:5501 en dur. 18-ai-tools.sh contient 192.168.1.30, 192.168.1.10:8006, 192.168.1.12:9443, 192.168.1.51:9443 en dur dans le heredoc. 20-ai-jobs.sh hardcode le port 5501. Pass 2 note que 20-ai-jobs.sh utilise correctement get_host_ip pour l'IP mais pas pour le port. Pass 3 identifie des IPs hardcodees supplementaires dans collect.sh. Cela viole la regle CLAUDE.md "JAMAIS d'IP:port dans le code".
- Impact : Toute modification d'IP casse ces scripts. Fuite d'information sur la topologie du reseau interne dans les pages HTML publiques.
- Priorite de correction : HAUTE
C-05 : StrictHostKeyChecking=no dans toutes les connexions SSH
- Confirme par : Pass 2 (F04) + Pass 3 (F-06)
- Severite definitive : BUG PROBABLE
- Description consolidee :
_common.sh (generate.d) et _common.sh (collect.d) + collect.sh utilisent tous StrictHostKeyChecking=no. En cas de MITM sur le reseau local (ARP spoofing), un attaquant peut intercepter les commandes SSH. Les credentials Redis hardcodes transitent par ces connexions SSH.
- Impact : Vulnerabilite MITM sur toutes les connexions SSH. Risque reduit en reseau local controle, mais reel.
- Priorite de correction : MOYENNE
C-06 : Absence de set -e / gestion d'erreurs silencieuse
- Confirme par : Pass 2 (F05) + Pass 3 (F-11)
- Severite definitive : BUG PROBABLE
- Description consolidee : Aucun des scripts generate.d/*.sh ne contient
set -e. collect.sh l'a explicitement retire ("set -e retire car le script gere ses propres erreurs") mais les erreurs sont masquees par 2>/dev/null || echo "". Les echecs de curl, jq, ssh sont silencieusement ignores, produisant des pages HTML avec du contenu vide ou "null" sans aucune indication d'erreur.
- Impact : Donnees obsoletes ou incorrectes affichees sans alerte. Debug extremement difficile.
- Priorite de correction : MOYENNE
C-07 : Echappement HTML incomplet (< et > seulement)
- Confirme par : Pass 2 (F03, F06) + Pass 3 (F-07, F-17)
- Severite definitive : BUG PROBABLE
- Description consolidee : L'echappement des donnees avant injection dans le HTML est incomplet. Seuls
< et > sont echappes (via sed). Les caracteres &, ", ' ne le sont pas. Ce pattern est present dans 26-claude.sh (fichiers markdown), 08-crons.sh (logs SSH), collect.sh (construction JSON manuelle). De plus, dans le JavaScript client (data-loader.js, 20-ai-jobs.sh), innerHTML est utilise sans echappement.
- Impact : Risque d'injection HTML/XSS si les sources de donnees contiennent des caracteres speciaux. En pratique, les sources sont internes, mais le risque existe si un nom de container ou un log contient du HTML.
- Priorite de correction : MOYENNE
C-08 : Deux fichiers CSS (dashboard.css = obsolete)
- Confirme par : Pass 1 (F2.1, F2.2)
- Severite definitive : BUG PROBABLE
- Description consolidee :
dashboard.css (689 lignes) est un sous-ensemble de style.css (1210 lignes). Les modules actifs utilisent style.css. Cependant, la verification sur le code source revele que templates.sh et yolo.html utilisent encore dashboard.css. Ce n'est donc pas entierement mort mais quasi-orphelin.
- Impact : Confusion de maintenance. Les pages utilisant dashboard.css ont un sous-ensemble de styles et des divergences mineures (taille de police nav, espacements).
- Priorite de correction : BASSE
C-09 : 25-services.sh a un design systeme completement autonome
- Confirme par : Pass 1 (F2.4)
- Severite definitive : BUG CERTAIN
- Description consolidee : Le module 25-services.sh n'utilise pas style.css. Il integre son propre design systeme complet (fond gradient, couleurs hardcodees #10b981, #ef4444, etc., pas de sticky header, pas de footer standard, sa propre mini-navigation). La page services.html a un look totalement different de toutes les autres pages du dashboard.
- Impact : Rupture visuelle majeure. L'utilisateur a l'impression de changer de site.
- Priorite de correction : HAUTE
C-10 : nav.js present mais quasi-mort
- Confirme par : Pass 1 (F1.2) + Pass 2 (implicite) + verification code
- Severite definitive : BUG PROBABLE (pas BUG CERTAIN)
- Description consolidee : Pass 1 affirme que nav.js n'est "jamais utilise" et qu'aucun module ne genere
<nav id="main-nav">. La verification sur le code source revele que nav.js EST charge par shortlinks.html et needfinder-v2.html, et que shortlinks.html contient bien <nav id="main-nav">. Donc nav.js n'est pas entierement mort mais est utilise par seulement 2 pages statiques (non generees par generate.d/). Il reste problematique car sa liste de liens diverge des autres navigations.
- Impact : Code quasi-orphelin contribuant a la fragmentation de la navigation.
- Priorite de correction : BASSE
C-11 : data-loader.js jamais utilise
- Confirme par : Pass 1 (F4.4) + Pass 3 (F-17 le mentionne)
- Severite definitive : BUG CERTAIN (code mort)
- Description consolidee : Le fichier
assets/data-loader.js (142 lignes) fournit un systeme generique de data-binding via data-bind et data/current.json. Aucune page generee ne l'inclut en <script>. Pass 3 mentionne son innerHTML non echappee, mais le point principal est que ce code n'est jamais execute.
- Impact : Code mort a supprimer.
- Priorite de correction : BASSE
C-12 : gen_footer_full() et gen_html_head() de _common.sh non utilisees
- Confirme par : Pass 1 (F5.2, F5.3) + Pass 3 (F-18 mentionne la duplication)
- Severite definitive : BUG PROBABLE
- Description consolidee : Les fonctions utilitaires centralisees (
gen_footer_full(), gen_html_head()) existent dans _common.sh mais sont ignorees par la plupart des modules. Chaque module genere son propre header, footer, et <head> avec des variantes (cache-busters figes, footers avec IPs hardcodees, timestamps differents). Cela contribue a la fragmentation et rend les corrections globales impossibles.
- Impact : Maintenance penible, impossibilite de modifier le template de facon centralisee.
- Priorite de correction : MOYENNE
C-13 : Polling 15s sans visibilitychange dans 19-ai-orchestrator.sh
- Confirme par : Pass 1 (F4.1)
- Severite definitive : BUG PROBABLE
- Description consolidee : La page ai-orchestrator.html fait 2 appels API toutes les 15 secondes sans verifier
document.visibilityState. Un onglet oublie en arriere-plan genere ~11520 appels/jour.
- Impact : Charge API inutile.
- Priorite de correction : BASSE
C-14 : Variables non quotees dans heredocs non-quotes (injection HTML)
- Confirme par : Pass 2 (F07) + Pass 3 (F-07 similaire)
- Severite definitive : BUG PROBABLE
- Description consolidee : Les heredocs non-quotes (
<< DELIM) interpolent des variables provenant de jq/API. Si les valeurs contiennent du HTML, il est injecte tel quel dans la page. Modules concernes : 19-ai-orchestrator.sh, 20-ai-jobs.sh, 25-services.sh.
- Impact : Injection HTML possible si une API interne retourne des donnees contenant des balises HTML.
- Priorite de correction : MOYENNE
C-15 : Mots de passe Redis hardcodes dans collect.sh (versionne)
- Confirme par : Pass 3 (F-03)
- Severite definitive : BUG CERTAIN
- Description consolidee : Les mots de passe Redis PROD (
urefsLoXibTZ36mtuygcLyNuqzOmIVkF) et DEV (rYfXNQRrVef2LXp8E1B06o4jiT5f5bxs) sont hardcodes en clair dans collect.sh. Ce script est versionne dans le repo git pousse vers O2switch.
- Impact : Exposition des mots de passe Redis dans l'historique git.
- Priorite de correction : CRITIQUE (meme niveau que C-01)
Note : Seule la Pass 3 a lu collect.sh en profondeur (les passes 1 et 2 se concentraient sur generate.d/). Confirme comme BUG CERTAIN car l'evidence est factuelle (code lu et cite).
C-16 : Token GitLab hardcode dans collect-gitlab.sh
- Confirme par : Pass 3 (F-05)
- Severite definitive : BUG CERTAIN
- Description consolidee :
glpat-yaowLwWBJhXfzJEC8UBC est hardcode en ligne 15 de collect-gitlab.sh. Ce fichier est versionne.
- Impact : Token GitLab expose dans le repo et l'historique git.
- Priorite de correction : CRITIQUE
C-17 : git add -A pousse tout sans filtrage vers O2switch
- Confirme par : Pass 3 (F-13) + lie a C-01
- Severite definitive : BUG CERTAIN
- Description consolidee :
generate.sh execute git add -A puis git push o2switch main. Le .gitignore est minimal (exclut current.json, history/*.json, logs/, archives/) mais n'exclut PAS les fichiers HTML sensibles (secrets.html, endpoints.html) ni les scripts contenant des credentials (collect.sh, collect-gitlab.sh).
- Impact : Tout nouveau fichier dans le dossier monitoring est automatiquement pousse vers O2switch. Amplifie l'impact de C-01, C-15, C-16.
- Priorite de correction : CRITIQUE
C-18 : services-registry.json owned par root avec permissions 600
- Confirme par : Pass 3 (F-14) + verification directe (confirme :
-rw------- root root)
- Severite definitive : BUG CERTAIN
- Description consolidee : Le fichier
services-registry.json est owned par root avec permissions 600. Le script generate.sh tourne en tant que gouroubleu. La commande chown dans le script ne peut pas corriger sans sudo. L'erreur est masquee par || true.
- Impact : Les modules generate.d qui ont besoin de ce fichier echouent silencieusement.
- Priorite de correction : HAUTE
Findings UNIQUES (1 seule passe)
U-01 : Token GitLab dans l'URL du remote git origin (.git/config)
- Source : Pass 3 (F-02)
- Severite : BUG CERTAIN
- Pourquoi les autres passes ne l'ont pas trouve : Pass 1 et 2 auditaient les scripts, pas la config git.
- Verdict : CONFIRME - Evidence factuelle, le fichier .git/config contient le token en clair.
U-02 : JWT Supabase anon keys hardcodes dans collect.sh
- Source : Pass 3 (F-04)
- Severite : BUG PROBABLE (pas BUG CERTAIN)
- Pourquoi les autres passes ne l'ont pas trouve : Pass 1 et 2 n'ont pas lu collect.sh en profondeur.
- Verdict : CONFIRME mais severite reduite - Les cles anon Supabase sont par conception destinees a etre publiques. L'impact est modere. Neanmoins, les hardcoder dans du code versionne est une mauvaise pratique.
U-03 : Injection jq dans get_config (parametre query)
- Source : Pass 2 (F08)
- Severite : RISQUE THEORIQUE
- Pourquoi les autres passes ne l'ont pas trouve : Angle trop specifique (securite bash).
- Verdict : CONFIRME RISQUE THEORIQUE - Tous les appels utilisent des chaines fixes. Non exploitable.
U-04 : sed -i avec regex sur contenu genere (25-services.sh)
- Source : Pass 2 (F10)
- Severite : RISQUE THEORIQUE
- Pourquoi les autres passes ne l'ont pas trouve : Pattern specifique non recherche par les autres passes.
- Verdict : CONFIRME RISQUE THEORIQUE - Les valeurs sont des entiers (length), donc pas de risque en pratique.
U-05 : inject_json() sans echappement </script>
- Source : Pass 2 (F11)
- Severite : RISQUE THEORIQUE
- Pourquoi les autres passes ne l'ont pas trouve : Pattern d'injection JSON-in-HTML non recherche.
- Verdict : CONFIRME RISQUE THEORIQUE - Le JSON est genere par les scripts eux-memes. Le risque est theorique mais le pattern est techniquement dangereux.
U-06 : SSH sans timeout uniforme dans 08-crons.sh
- Source : Pass 2 (F12)
- Severite : RISQUE THEORIQUE
- Pourquoi les autres passes ne l'ont pas trouve : Detail d'implementation non recherche.
- Verdict : CONFIRME - Inconsistance mineure mais reelle.
U-07 : Arithmetic comparison sans validation numerique (12-raidz.sh)
- Source : Pass 2 (F13)
- Severite : RISQUE THEORIQUE
- Pourquoi les autres passes ne l'ont pas trouve : Detail bash specifique.
- Verdict : CONFIRME RISQUE THEORIQUE - Peut echouer silencieusement si jq retourne "null".
U-08 : Variable non quotee dans echo/tr (12-raidz.sh)
- Source : Pass 2 (F14)
- Severite : RISQUE THEORIQUE
- Pourquoi les autres passes ne l'ont pas trouve : Detail bash specifique.
- Verdict : CONFIRME RISQUE THEORIQUE - Les etats ZFS sont des mots simples, pas de risque reel.
U-09 : XSS dans JavaScript client (20-ai-jobs.sh innerHTML)
- Source : Pass 2 (F22)
- Severite : RISQUE THEORIQUE
- Pourquoi les autres passes ne l'ont pas trouve : Pass 1 n'a pas lu la partie JS de 20-ai-jobs.sh (au-dela de la ligne 1400). Pass 3 n'a pas examine le JS genere.
- Verdict : CONFIRME RISQUE THEORIQUE - Les donnees proviennent d'APIs internes authentifiees.
U-10 : Pas de nettoyage de /tmp/dashboard-33800
- Source : Pass 2 (F24)
- Severite : RISQUE THEORIQUE
- Pourquoi les autres passes ne l'ont pas trouve : Detail d'implementation.
- Verdict : CONFIRME - Mineur. Serveur a utilisateur unique. Mais les fichiers HTML contenant des credentials y restent.
U-11 : IP PVE inconsistante dans config.json (ip vs ip_main)
- Source : Pass 3 (F-08)
- Severite : BUG PROBABLE
- Pourquoi les autres passes ne l'ont pas trouve : Pass 1 et 2 n'ont pas analyse la semantique de config.json en profondeur.
- Verdict : CONFIRME - L'ambiguite entre .4 et .10 est reelle et peut causer des confusions.
U-12 : Port browser-connector inconsistant (5401 vs 5404)
- Source : Pass 1 (F3.5) + Pass 3 (F-09)
- Severite : BUG PROBABLE
- Pourquoi : Identifie separement par Pass 1 et Pass 3 avec le meme constat (config.json dit 5401, CLAUDE.md dit 5404).
- Verdict : CONFIRME - A verifier lequel est correct et synchroniser.
U-13 : Port connectors-api inconsistant (5400 vs 5403)
- Source : Pass 3 (F-10)
- Severite : BUG PROBABLE
- Pourquoi les autres passes ne l'ont pas trouve : Detail de config.json vs CLAUDE.md.
- Verdict : CONFIRME - Meme pattern que U-12. A clarifier (port interne vs expose).
U-14 : Race condition git push en background
- Source : Pass 3 (F-19)
- Severite : RISQUE THEORIQUE
- Pourquoi les autres passes ne l'ont pas trouve : Pattern specifique au deploiement.
- Verdict : CONFIRME RISQUE THEORIQUE - Le push en
& peut entrer en conflit avec le prochain git add.
U-15 : Pas de nettoyage de /tmp/monitoring-buffer
- Source : Pass 3 (F-15)
- Severite : BUG PROBABLE
- Pourquoi les autres passes ne l'ont pas trouve : Concerne collect.sh, hors scope des autres passes.
- Verdict : CONFIRME - Le trap ne nettoie que le lockfile, pas le buffer.
U-16 : Notification JSON cassee par newline dans generate.sh
- Source : Pass 3 (F-21)
- Severite : BUG PROBABLE
- Pourquoi les autres passes ne l'ont pas trouve : Detail de generate.sh (fin de fichier).
- Verdict : CONFIRME - Le
\n dans NOTIF_BODY casse le JSON. La notification echoue probablement a chaque execution.
U-17 : Lockfile PID vulnerable au PID reuse
- Source : Pass 3 (F-24)
- Severite : RISQUE THEORIQUE
- Pourquoi les autres passes ne l'ont pas trouve : Detail du mecanisme de lock de collect.sh.
- Verdict : CONFIRME RISQUE THEORIQUE - Le cron horaire et la duree courte minimisent le risque.
flock serait plus robuste.
U-18 : Globbing non protege dans les boucles for (26-claude.sh)
- Source : Pass 2 (F17)
- Severite : RISQUE THEORIQUE
- Pourquoi les autres passes ne l'ont pas trouve : Detail bash specifique.
- Verdict : CONFIRME RISQUE THEORIQUE - La convention de nommage protege en pratique.
Contradictions resolues
Contradiction 1 : nav.js est-il "mort" ou "utilise" ?
- Pass 1 (F1.2) affirme que nav.js n'est "jamais utilise" et qu'aucun module ne genere
<nav id="main-nav">.
- Pass 3 (F-18) le mentionne comme l'un des 5 systemes de navigation.
- Verification :
shortlinks.html contient <nav class="header-nav" id="main-nav"> et charge nav.js. needfinder-v2.html aussi.
- Resolution : Pass 1 est partiellement incorrecte. nav.js n'est pas mort : il est utilise par 2 pages statiques (non generees par generate.d/). Cependant, aucun module generate.d/ ne le charge, ce qui confirme qu'il est quasi-orphelin dans le contexte du systeme de generation. La severite est reduite de "code mort" a "code quasi-orphelin".
Contradiction 2 : Severite de StrictHostKeyChecking=no
- Pass 2 (F04) classe cela comme "BUG PROBABLE".
- Pass 3 (F-06) classe cela comme "BUG CERTAIN".
- Resolution : Pass 2 a la meilleure classification. Sur un reseau local controle,
StrictHostKeyChecking=no est une mauvaise pratique mais pas un "bug certain" au sens ou il ne cause pas de dysfonctionnement observable. C'est un BUG PROBABLE (le risque est reel si le reseau est compromis). Severite retenue : BUG PROBABLE.
Contradiction 3 : Nombre de systemes de navigation
- Pass 1 identifie 4 systemes de navigation.
- Pass 3 identifie 5 systemes (ajoute
templates.sh).
- Verification :
templates.sh existe et contient html_header() avec sa propre liste de liens. Il est reference par generate.sh et generate-yolo.sh.
- Resolution : Pass 3 est plus complete. Il y a effectivement au moins 5 systemes de templates. Cela aggrave le finding C-02.
Contradiction 4 : 20-ai-jobs.sh - polling JS present ou absent ?
- Pass 1 (F4.2) note que le meta-refresh est desactive avec un commentaire mentionnant "JS polling", mais n'a pas trouve de
setInterval (fichier lu partiellement).
- Pass 2 a lu 2248 lignes de 20-ai-jobs.sh (integralite) et n'a pas specifiquement releve l'absence de polling.
- Resolution : Pass 1 a signale une incertitude honnete due a sa lecture partielle. Pass 2 n'a pas contredit car son angle etait la securite bash, pas la fonctionnalite. Le finding reste A VERIFIER sur la presence effective d'un setInterval dans la partie JS.
Faux positifs elimines
FP-01 : UUOC (Useless Use of Cat) -- Pass 2 (F18)
Justification : Style shell sous-optimal mais zero impact sur la securite ou le fonctionnement. Pas un finding d'audit pertinent.
FP-02 : deploy_page ne verifie pas le resultat du cp -- Pass 2 (F19)
Justification : Pass 2 a elle-meme reclassifie cela comme faux positif apres analyse. Le code de retour de cp est bien propage.
FP-03 : $title non echappe dans generate.sh -- Pass 2 (F20)
Justification : Pass 2 a elle-meme reclassifie cela. Toutes les valeurs sont des chaines fixes codees en dur.
FP-04 : base64 decode dans 25-services.sh -- Pass 2 (F23)
Justification : Pass 2 a elle-meme reclassifie cela. Le pattern @base64 + base64 -d est un idiome robuste pour jq-dans-while.
FP-05 : Execution directe au source dans 09-architecture.sh -- Pass 2 (F21)
Justification : C'est le pattern standard du projet (certains modules appellent la fonction au chargement, d'autres non). Ce n'est pas un bug, c'est une inconsistance de convention qui n'a aucun impact fonctionnel.
Top 10 actions prioritaires
| # |
Action |
Findings |
Priorite |
Effort estime |
| 1 |
Externaliser TOUS les credentials des scripts et du HTML genere. Charger depuis un fichier .env ou un vault, exclus du git. Enrichir .gitignore pour exclure secrets.html, endpoints.html, collect.sh, collect-gitlab.sh du push O2switch. |
C-01, C-15, C-16, C-17, U-01, U-02 |
CRITIQUE |
2-3h |
| 2 |
Unifier la navigation en un seul systeme. Supprimer les 4 systemes redondants. Choisir une seule fonction (ex: gen_header dans _common.sh) et l'appeler depuis tous les modules. Mettre a jour la liste de liens. |
C-02, C-10, C-12 |
CRITIQUE |
3-4h |
| 3 |
Definir les variables CSS manquantes dans style.css (ajouter les aliases : --bg-secondary, --text-primary, --accent-blue, etc. mappes vers les variables existantes). |
C-03 |
HAUTE |
30 min |
| 4 |
Corriger les permissions de services-registry.json (sudo chown gouroubleu:gouroubleu). Ajouter un check dans generate.sh pour detecter et signaler les fichiers non lisibles. |
C-18 |
HAUTE |
15 min |
| 5 |
Aligner 25-services.sh sur le design commun (charger style.css, utiliser les classes standard). |
C-09 |
HAUTE |
1-2h |
| 6 |
Remplacer les IPs hardcodees par les fonctions get_host_ip() / get_config() dans 18-ai-tools.sh, 19-ai-orchestrator.sh, 20-ai-jobs.sh, collect.sh. |
C-04 |
HAUTE |
1h |
| 7 |
Creer une fonction html_escape() dans _common.sh qui echappe &, <, >, ", '. L'appliquer a toutes les injections de donnees SSH/API dans le HTML. |
C-07, C-14 |
MOYENNE |
1h |
| 8 |
Remplacer StrictHostKeyChecking=no par StrictHostKeyChecking=accept-new dans tous les scripts. |
C-05 |
MOYENNE |
15 min |
| 9 |
Supprimer le code mort : dashboard.css (apres migration de templates.sh et yolo.html vers style.css), data-loader.js. Evaluer si nav.js est encore necessaire. |
C-08, C-11, C-10 |
BASSE |
30 min |
| 10 |
Corriger la notification JSON dans generate.sh : utiliser jq pour construire le JSON au lieu d'interpoler des variables avec newlines. |
U-16 |
BASSE |
15 min |
Annexe : Couverture des passes
| Fichier/zone |
Pass 1 |
Pass 2 |
Pass 3 |
| generate.d/*.sh |
OUI (partiel pour certains) |
OUI (integrale) |
NON |
| generate.sh |
partiel |
partiel |
OUI |
| collect.sh |
NON |
NON |
OUI |
| collect.d/*.sh |
NON |
NON |
OUI |
| collect-gitlab.sh |
NON |
NON |
OUI |
| templates.sh |
NON |
NON |
OUI |
| assets/*.css |
OUI |
NON |
NON |
| assets/*.js |
OUI |
NON |
partiel |
| config.json |
OUI |
OUI |
OUI |
| .git/config |
NON |
NON |
OUI |
| .gitignore |
NON |
NON |
OUI |
| Permissions fichiers |
NON |
NON |
OUI |
Cette matrice montre que les 3 passes etaient complementaires : la Pass 1 couvrait le frontend (CSS/JS/navigation), la Pass 2 la securite bash des scripts de generation, et la Pass 3 la collecte, le deploiement et l'integration. Les findings critiques sur les credentials beneficient de la convergence des 3 angles.
Rapport de confrontation genere par Claude Opus 4.6 -- 15/02/2026