# promo/ — pages de présentation Set-OPS Cinq pages web **autonomes** (un seul fichier chacune, aucun asset externe, aucune dépendance réseau) : quatre pages de présentation liées par la barre de navigation, et une chronique éditoriale accessible depuis la page Capacités. | Fichier | Public visé | Répond à | |---|---|---| | `index.html` | sysadmin, personne technique | *Qu'est-ce que je peux faire avec ça ?* | | `offres.html` | prospect, client | *Qu'est-ce que vous pouvez bâtir pour moi ?* | | `tarifs.html` | prospect, acheteur | *Combien ça coûte ?* | | `valeur.html` | direction, CA, bailleur de fonds | *Qu'est-ce que ça me rapporte, et comment le vérifier ?* | | `histoire.html` | lecteur, contributeur, futur exploitant | *Comment ce moteur s'est-il construit, et qu'a-t-il appris ?* | > ⚠️ **`tarifs.html` est du matériel commercial de Chezlepro inc.**, publié dans un dépôt > public. Les montants y sont donc visibles de tous, y compris des concurrents et des > clients existants, et l'historique git en conserve chaque version. C'est un choix > assumé ; le rappeler avant chaque ajustement de prix. - **Thème** : identité *Alliance Boréale* (ciel nocturne + aurore + constellation), reprise des thèmes Keycloak/Forgejo du dépôt. ## Conventions communes — à respecter pour toute modification Les quatre pages forment un ensemble navigable : ce qui suit doit rester **identique** partout, sous peine de dérive (c'est déjà arrivé une fois, et il a fallu une passe complète pour la résorber). | Élément | Règle | |---|---| | **Adresse au lecteur** | **Vouvoiement**, sans exception. Ce sont des pages commerciales. | | **Barre de navigation** | `Capacités · Offres · Tarifs · Valeur` + bouton « Nous parler ». Même ordre, mêmes libellés, page courante marquée `aria-current="page"`. | | **Marque** | `Set-OPS · Chezlepro` dans la barre ; `Chezlepro inc. · Saint-Bruno-de-Montarville, Québec` au pied. | | **``** | `Set-OPS — <Section> · Chezlepro` | | **Vocabulaire d'état** | Trois valeurs seulement : **Éprouvé** (`.st.ok`), **En chantier** (`.st.wip`), **Feuille de route** (`.st.road`). Jamais d'autre mot, jamais d'autre classe. | | **Fin de page** | Section `#reserves` (bloc `.honest`) puis bloc `.close`. Les quatre pages assument leurs limites. | | **CSS partagé** | Un sélecteur commun (`section`, `.card`, `.sec-head`, `ul.does`, `.st`, `footer`…) doit avoir **la même déclaration** dans les quatre fichiers. | Vérifier avant de committer : ```bash python3 - <<'EOF' import re,pathlib from collections import defaultdict r=defaultdict(dict) for f in ['index.html','offres.html','tarifs.html','valeur.html']: css=re.sub(r'/\*.*?\*/','',re.search(r'<style>(.*?)</style>', pathlib.Path('promo',f).read_text(encoding='utf-8'),re.S).group(1),flags=re.S) d,buf,sel=0,'',None for c in css: if c=='{': d+=1 if d==1: sel,buf=buf.strip(),'' else: buf+=c elif c=='}': d-=1 if d==0: if not sel.startswith('@'): r[sel][f]=re.sub(r'\s+','',buf) buf='' else: buf+=c else: buf+=c print("conflits CSS :",sum(1 for s,d in r.items() if len(set(d.values()))>1)) EOF ``` - **Honnêteté** : les capacités **éprouvées** (déployées sur VM réelles) sont distinguées de ce qui est **en chantier** et de la **feuille de route**, conformément au principe « ne jamais affirmer plus que ce qui est prouvé » (cf. `docs/audit/`). Les trois pages portent une section de réserves assumées. ## `offres.html` — périmètre tiré des modèles réels Chaque offre correspond à un modèle d'instance existant, et le **nombre de machines annoncé est celui du plan**, pas une estimation : | Offre | Modèle | VM | État | |---|---|---|---| | Le Socle | `socle` (public) | 4 | éprouvé | | Identité | `identite` | 7 | éprouvé | | Maison OBNL · Cabinet | `collaboration` | 8 | **en chantier** | | Atelier | `forge` | 6 | éprouvé | | Vigie | `observabilite` | 7 | éprouvé | | Intégral | `integral` | 12 | éprouvé | | Présence Web | `presence-web` | 7 | **feuille de route — non vendable** | > Si un modèle change de périmètre (VM ajoutée, module éprouvé), **mettre la page à jour** : > son intérêt tient entièrement à ce que ces chiffres soient vrais. Les montants de départ sont repris de `tarifs.html`, dont c'est la source de vérité — en cas d'ajustement de prix, **modifier `tarifs.html` puis reporter dans `offres.html`**. ## `tarifs.html` — grille tarifaire Chezlepro inc. Alignée sur les **six offres du site chezlepro.ca** (diagnostic, socle opérateur, tenant portable, audit-ready ops, exploitation gérée, observabilité), et non sur les noms de modèles Set-OPS. | Mandat | Prix de départ | |---|---| | Diagnostic & Trajectoire | dès 4 500 $ (déduit du mandat suivant) | | Socle Opérateur Souverain | dès 18 000 $ | | Tenant Portable Clé en Main | dès 12 000 $ · dès 7 500 $ pour les suivants | | Audit-Ready Ops | dès 9 000 $ | | Observabilité & Journalisation | dès 7 500 $ | | Parcours Démarrage Souverain | dès 38 000 $ (au lieu de 42 000 $) | | Exploitation Gérée & Transfert | 750 / 1 500 / 2 800 $ par mois | > **Ces montants sont des estimations de marché**, calées sur un taux effectif de > ~1 000–1 100 $/jour (firme spécialisée québécoise), pas des prix validés par une vente > réelle. À confronter au premier vrai mandat et à corriger. Dollars canadiens, avant taxes. ## `valeur.html` — le calculateur Le comparatif coût total est **interactif** : le visiteur remplace les hypothèses par les siennes (personnes desservies, coût des abonnements, matériel, mise en place, exploitation) et l'addition se refait en direct sur un horizon de 5 ans, matériel amorti sur 5 ans. Il affiche **honnêtement le cas défavorable** : sous ~40 personnes (aux valeurs par défaut), l'autohébergement ne se rembourse pas dans l'horizon retenu, et la page le dit — le gain devient la souveraineté, pas le budget. Les valeurs par défaut ne sont pas des tarifs Set-OPS : ce sont des ordres de grandeur à remplacer. ## Voir / publier ### `histoire.html` — la chronique du dépôt Huit chapitres racontent les décisions et les épreuves consignées entre le 24 juin et le 17 septembre 2026. Le corpus est **figé au commit `05b85eb`** : 641 commits accessibles depuis cette révision, fusions comprises, avec leurs dates d'auteur. Les chiffres décrivent cet instantané, pas l'état courant du dépôt. Les sources de chaque chapitre ouvrent le titre original, la date, l'identifiant complet et la commande `git show` correspondante. L'archive intégrée permet de rechercher les 641 titres et de filtrer par mois, sans réseau. Le récit, le graphique et les réserves restent lisibles sans JavaScript ; la recherche et les détails interactifs nécessitent JavaScript. La page conserve la marque, les liens de navigation et la palette nocturne, avec une composition éditoriale propre. Ses styles sont isolés sous `.history` : ils ne modifient pas les sélecteurs communs aux quatre pages commerciales. Elle comprend une mise en page mobile, une feuille d'impression et le respect du mouvement réduit. Pour prolonger cette chronique, choisir explicitement une nouvelle révision, relire les commits concernés et mettre à jour ensemble le récit, le JSON `commit-data`, le graphique journalier, les compteurs, les périodes et le lien de la page Capacités. Ne pas remplacer les résultats historiques par des affirmations sur la flotte actuelle. ### Ouvrir les pages ```bash xdg-open promo/histoire.html xdg-open promo/offres.html python3 -m http.server -d promo 8080 # puis http://localhost:8080/offres.html ``` Les fichiers sont prêts à déposer tels quels sur n'importe quel hébergement statique (Forgejo Pages, un vhost `serveur_nginx`, etc.).