Les pages ayant été écrites l'une après l'autre, six dérives s'étaient installées entre elles. Passe de normalisation : - Adresse au lecteur : index.html tutoyait (17 occurrences), les trois autres vouvoyaient. Vouvoiement partout — ce sont des pages commerciales. - Marque : trois pages affichaient « Alliance Boréale », tarifs affichait « Chezlepro · tarifs ». Désormais « Set-OPS · Chezlepro » dans la barre et « Chezlepro inc. · Saint-Bruno-de-Montarville, Québec » au pied. - Navigation : quatre barres différentes (libellés et ordres distincts) → Capacités · Offres · Tarifs · Valeur + « Nous parler », identique partout, page courante marquée aria-current="page". - Pieds de page : quatre structures → une seule, licence AGPLv3 incluse. - Vocabulaire d'état : index utilisait .tag proven/soon, les autres .st ok/wip/road. Un seul système : Éprouvé · En chantier · Feuille de route. - CSS : 35 sélecteurs partagés avaient des déclarations divergentes → 0 conflit. Deux étaient de vrais conflits de mise en page (.beats 4 colonnes contre 3, .stats grille contre flex) ; passés en repeat(auto-fit,minmax(...)), une seule règle qui s'adapte au nombre d'éléments. Ajoute une section « Nos réserves » à index.html — seule page à en manquer, alors que c'est celle qui affirme le plus de capacités. Les quatre assument désormais leurs limites (mainteneur unique, épreuve de l'opérateur indépendant). promo/README.md consigne les conventions communes en tableau et fournit le script de détection des conflits CSS à lancer avant commit. Validé : liens, balises, identifiants, équilibre CSS et node --check du JS sur les quatre pages ; 0 conflit CSS ; prouver.py --verifier → CONFORME 16/16. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| index.html | ||
| offres.html | ||
| README.md | ||
| tarifs.html | ||
| valeur.html | ||
promo/ — pages de présentation Set-OPS
Quatre pages web autonomes (un seul fichier chacune, aucun asset externe, aucune dépendance réseau), sœurs de thème et liées entre elles par la barre de navigation.
| 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 ? |
⚠️
tarifs.htmlest 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. |
<title> |
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 :
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
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.).