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>
129 lines
6.2 KiB
Markdown
129 lines
6.2 KiB
Markdown
# 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.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. |
|
||
| **`<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 :
|
||
|
||
```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
|
||
|
||
```bash
|
||
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.).
|