diff --git a/docs/superpowers/plans/2026-07-09-bus-axer-workspace.md b/docs/superpowers/plans/2026-07-09-bus-axer-workspace.md new file mode 100644 index 0000000..ceac6df --- /dev/null +++ b/docs/superpowers/plans/2026-07-09-bus-axer-workspace.md @@ -0,0 +1,1153 @@ +# Bus Axer Workspace + Blog Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Créer le workspace git complet du projet d'aménagement du bus Irisbus Axer (atelier mobile, VASP ≤9 places) + un blog de chantier Hugo « hackerspace » servi sur Tower à `bus.saillant.cc`. + +**Architecture:** Repo documentaire structuré par domaines numérotés (00→80), documents seed réels dans chaque domaine, hébergé sur Gitea `git.saillant.cc`. Blog Hugo dans `blog/` avec thème terminal custom vendored (zéro dépendance upstream), publié en statique via nginx dockerisé sur Tower, exposé par l'infra `*.saillant.cc` existante (cloudflared ou Traefik selon investigation). + +**Tech Stack:** git, Gitea API, Hugo (extended non requis), nginx:alpine (Docker, pinné par digest), rsync, cloudflared **ou** Traefik 3. + +## Global Constraints + +- Docs de contenu en **français** ; commits en **anglais**, sujet ≤ 50 chars, corps ≤ 72 cols, **pas d'attribution IA**, pas de `--no-verify`. +- Remote Gitea en **HTTPS + token** : `https://electron@git.saillant.cc/electron-rare/bus-axer.git` (le `electron@` échappe à la règle globale `insteadOf` → ne PAS l'omettre ; SSH :2222 cassé). +- Politique supply-chain : pas de thème Hugo en submodule/upstream flottant (thème custom écrit dans le repo) ; image Docker pinnée par digest. +- Répertoire de travail : `/Users/electron/Documents/BUS` (git déjà initialisé, branche `main`, `.gitignore` + spec déjà committés). +- Hôtes : Tower = `clems@192.168.0.120` (Tailscale `100.78.6.122`) ; electron-server = `electron@100.78.191.52`. SSH sans mot de passe. + +--- + +### Task 1: Documents racine (README, CLAUDE.md, ROADMAP, DECISIONS) + +**Files:** +- Create: `README.md` +- Create: `CLAUDE.md` +- Create: `ROADMAP.md` +- Create: `DECISIONS.md` + +**Interfaces:** +- Produces: conventions du repo (CLAUDE.md) que toutes les tâches suivantes respectent ; la structure de dossiers annoncée dans README est celle créée par les Tasks 2–4 et 6. + +- [ ] **Step 1: Écrire `README.md`** + +```markdown +# BUS — Irisbus Axer → atelier mobile + +Rénovation et aménagement d'un bus **Irisbus Axer** en **atelier / labo +mobile** : électronique & prototypage + fabrication numérique (imprimantes +3D, découpe laser, petite CNC), avec **1 cabine de douche** et **9 places +assises** homologuées. + +- **Objectif réglementaire** : reclassification **VASP atelier ≤ 9 places** + (permis C, passage DREAL/UTAC). +- **Horizon** : 5 ans — voir [ROADMAP.md](ROADMAP.md). +- **Blog de chantier** : https://bus.saillant.cc (sources dans `blog/`). + +## État + +- [x] Bus acquis, intérieur vidé +- [ ] Conception (plans, poids, énergie) +- [ ] Dossier réglementaire VASP +- [ ] Chantier + +## Structure + +| Dossier | Contenu | +|---------|---------| +| `00-vehicule/` | Fiche technique Axer, état initial, photos de départ | +| `10-reglementaire/` | Parcours VASP, DREAL/UTAC, checklists, contacts | +| `20-conception/` | Implantation, zoning, **suivi de poids par essieu** | +| `30-energie-elec/` | Bilan de puissance, architecture élec, schémas KiCad | +| `40-fluides/` | Eau/douche, chauffage, ventilation/extraction | +| `50-amenagement/` | Isolation, mobilier, 9 sièges homologués | +| `60-machines/` | Parc machines, établis, arrimage en roulage | +| `70-chantier/` | Journal de chantier, photos datées | +| `80-budget/` | Budget prévisionnel, dépenses, devis | +| `blog/` | Site Hugo → bus.saillant.cc | + +Les décisions structurantes sont tracées dans [DECISIONS.md](DECISIONS.md). +``` + +- [ ] **Step 2: Écrire `CLAUDE.md`** + +```markdown +# CLAUDE.md — projet BUS (Irisbus Axer → atelier mobile) + +Workspace documentaire du chantier d'aménagement. **Pas un projet de +code** : l'essentiel est du markdown, plus un site Hugo (`blog/`) et des +schémas KiCad (`30-energie-elec/kicad/`). + +## Conventions + +- **Docs en français** (réglementaire FR, artisans, fournisseurs). + Commits en anglais, sujet ≤ 50 chars, pas d'attribution IA. +- Toute décision structurante → entrée datée dans `DECISIONS.md`. +- Tout ajout de masse significatif (> 5 kg) → mise à jour de + `20-conception/suivi-poids.md`. C'est le point dur n°1 du VASP. +- Journal de chantier : un fichier par session, + `70-chantier/journal/AAAA-MM-JJ-sujet.md`. +- Photos compressées (< 500 ko) dans `70-chantier/photos/AAAA-MM-JJ/` ; + **vidéos hors repo**. +- Dépenses : une ligne par achat dans `80-budget/depenses.csv`. + +## Blog + +- Sources Hugo dans `blog/`, thème terminal custom vendored + (`blog/themes/terminal-bus/`) — ne pas ajouter de thème upstream. +- Publier : `blog/deploy.sh` (build + rsync vers Tower, nginx `:8090`, + public sur https://bus.saillant.cc). + +## Git + +- Remote : `https://electron@git.saillant.cc/electron-rare/bus-axer.git` + (HTTPS + token ; garder le `electron@` dans l'URL — il échappe à la + règle globale `insteadOf` qui réécrirait vers le SSH :2222 cassé). +``` + +- [ ] **Step 3: Écrire `ROADMAP.md`** + +```markdown +# Roadmap 5 ans + +| Année | Jalon principal | Statut | +|-------|-----------------|--------| +| An 1 (2026-27) | Conception complète (plans, suivi poids, bilan énergie) + contact DREAL/RTI + isolation | en cours | +| An 2 (2027-28) | Énergie & électricité (solaire, batteries, distribution) | à venir | +| An 3 (2028-29) | Fluides (douche, chauffage, ventilation) + aménagement structurel | à venir | +| An 4 (2029-30) | Mobilier atelier, sièges homologués, installation machines | à venir | +| An 5 (2030-31) | Finitions, dossier VASP, passage DREAL/UTAC, mise en service | à venir | + +## An 1 — détail + +- [ ] Compléter `00-vehicule/fiche-technique.md` (peser le bus : PV réel !) +- [ ] Relevé coté de l'intérieur vidé → `20-conception/implantation.md` +- [ ] Premier contact DREAL / centre RTI → `10-reglementaire/contacts.md` +- [ ] Bilan de puissance machines → `30-energie-elec/bilan-puissance.md` +- [ ] Zoning validé (atelier / douche / 9 places / circulation) +- [ ] Choix isolation + pose +- [ ] Blog lancé (premier billet publié) + +Le blog raconte le chantier dès l'An 1. +``` + +- [ ] **Step 4: Écrire `DECISIONS.md`** + +```markdown +# Registre des décisions + +Format : une entrée par décision structurante, la plus récente en haut. + +## 2026-07-09 — Blog de chantier Hugo « hackerspace » sur Tower + +**Décision** : blog statique Hugo (`blog/`), thème terminal custom +vendored, servi par nginx dockerisé sur Tower `:8090`, exposé sur +https://bus.saillant.cc via l'infra `*.saillant.cc` existante. +**Pourquoi** : markdown cohérent avec le repo, zéro dépendance upstream +(politique supply-chain), Tower déjà allumé en continu. +**Alternatives écartées** : Zola/Astro (écosystème moins connu ici), +thème upstream en submodule (flottant, non audité). + +## 2026-07-09 — VASP atelier ≤ 9 places + +**Décision** : reclassification en VASP atelier avec 9 places assises max. +**Pourquoi** : conduite au permis C, sortie du régime transport en commun +(fin des contrôles semestriels), tout en gardant la capacité de déplacer +une équipe. +**Conséquences** : suivi de poids par essieu obligatoire dès la +conception ; sièges et ancrages homologués ; exigences DREAL à intégrer +en amont (`10-reglementaire/`). + +## 2026-07-09 — Structure du workspace par domaines + +**Décision** : dossiers numérotés par domaine technique (00→80) plutôt +que par phase chronologique. +**Pourquoi** : sur 5 ans, chaque domaine vit à son rythme et traverse +plusieurs phases ; la roadmap transversale vit dans `ROADMAP.md`. +``` + +- [ ] **Step 5: Vérifier et committer** + +Run: `cd /Users/electron/Documents/BUS && ls README.md CLAUDE.md ROADMAP.md DECISIONS.md && git add README.md CLAUDE.md ROADMAP.md DECISIONS.md && git commit -m "docs: add project root docs"` +Expected: les 4 fichiers listés, commit créé sans erreur de hook. + +--- + +### Task 2: Domaines 00-vehicule, 10-reglementaire, 20-conception + +**Files:** +- Create: `00-vehicule/fiche-technique.md` +- Create: `00-vehicule/etat-initial.md` +- Create: `00-vehicule/photos/.gitkeep` +- Create: `10-reglementaire/parcours-vasp.md` +- Create: `10-reglementaire/checklist-conformite.md` +- Create: `10-reglementaire/contacts.md` +- Create: `20-conception/implantation.md` +- Create: `20-conception/suivi-poids.md` + +**Interfaces:** +- Consumes: conventions de `CLAUDE.md` (Task 1). +- Produces: `20-conception/suivi-poids.md` référencé par CLAUDE.md et par les domaines 30–60 (chaque équipement ajouté y inscrit sa masse). + +- [ ] **Step 1: Écrire `00-vehicule/fiche-technique.md`** + +```markdown +# Fiche technique — Irisbus Axer + +À compléter depuis la carte grise et une pesée réelle. + +| Champ | Valeur | +|-------|--------| +| Modèle exact / année | _à relever_ | +| Immatriculation | _à relever_ | +| Genre CG actuel (J.1) | TCP | +| Moteur / puissance | _à relever_ | +| Kilométrage | _à relever_ | +| Longueur / largeur / hauteur | _à mesurer_ | +| Empattement | _à relever_ | +| PTAC (F.2) | _à relever_ | +| PV constructeur | _à relever_ | +| **PV réel pesé (vide, après vidage)** | _peser en station — donnée d'entrée du suivi de poids_ | +| Charge utile disponible | PTAC − PV pesé | +| Masses max par essieu (F.2.1 / plaques) | _à relever_ | + +## Notes + +- La pesée réelle (total + par essieu si possible) est le point zéro de + `20-conception/suivi-poids.md` — à faire avant tout aménagement. +``` + +- [ ] **Step 2: Écrire `00-vehicule/etat-initial.md`** + +```markdown +# État initial (après vidage) + +Inventaire au démarrage du projet — 2026-07. + +## Ce qui a été déposé + +- Sièges passagers d'origine : _préciser combien, conservés/vendus ?_ + +## Ce qui reste à bord + +- _à inventorier : poste de conduite, trappes, gaines, câblages, + chauffage d'origine, éclairage, portes/issues de secours…_ + +## Points de vigilance relevés + +- _corrosion, étanchéité (joints de baies, lanterneaux), plancher…_ + +Photos de départ : `photos/` (compressées, datées). +``` + +- [ ] **Step 3: Écrire `10-reglementaire/parcours-vasp.md`** + +```markdown +# Parcours VASP atelier ≤ 9 places + +Objectif : carte grise genre **VASP**, carrosserie **atelier** (« ATEL »), +9 places assises max → conduite au permis C, sortie du régime transport +en commun. + +## Étapes (à confirmer auprès de la DREAL) + +1. **Pesée** du véhicule vidé (point zéro poids). +2. **Conception conforme d'abord** : ancrages sièges, installation + électrique, gaz éventuel, issues, extincteurs — connaître les + exigences AVANT de construire. +3. **Aménagement** documenté (photos, factures, schémas — ce repo). +4. **Dossier RTI** (réception à titre isolé) : notice descriptive, + plans, attestations (élec si requis), certificat de carrossage le + cas échéant. +5. Passage **DREAL** (ou UTAC selon région/cas) → procès-verbal RTI. +6. Préfecture / ANTS : nouvelle carte grise VASP ATEL. + +## Questions ouvertes + +- [ ] Liste exacte des pièces exigées par la DREAL locale ? +- [ ] Attestation électrique requise (Qualifelec / organisme) ? +- [ ] Exigences sur la douche (eaux grises) en VASP atelier ? +- [ ] Sièges : homologation R14/R17 des ancrages rapportés ? + +Réponses et contacts → `contacts.md` ; état → `checklist-conformite.md`. +``` + +- [ ] **Step 4: Écrire `10-reglementaire/checklist-conformite.md`** + +```markdown +# Checklist conformité VASP atelier + +À valider au fil du chantier — chaque ligne cochée cite sa source +(échange DREAL, texte, contrôleur). + +## Masses +- [ ] PTAC respecté (marge ≥ 10 %) — cf. `../20-conception/suivi-poids.md` +- [ ] Masses par essieu respectées + +## Places assises +- [ ] ≤ 9 places (conducteur inclus) +- [ ] Sièges et ancrages homologués, ceintures + +## Électricité +- [ ] Circuit cellule séparé du circuit véhicule +- [ ] Protections (fusibles/disjoncteurs) dimensionnées et documentées +- [ ] Coupe-batterie cellule accessible + +## Incendie / issues +- [ ] Extincteur(s) fixé(s) et accessible(s) +- [ ] Issues de secours conservées et dégagées +- [ ] Détecteur de fumée / CO + +## Machines (spécifique atelier) +- [ ] Arrimage machines conforme en roulage (cf. `../60-machines/fixations.md`) +- [ ] Extraction fumées laser vers l'extérieur +``` + +- [ ] **Step 5: Écrire `10-reglementaire/contacts.md`** + +```markdown +# Contacts réglementaires + +| Qui | Rôle | Contact | Dernier échange | +|-----|------|---------|-----------------| +| DREAL _région à préciser_ | RTI / réception VASP | _à trouver_ | — | +| Centre de pesée poids lourds | Pesée point zéro | _à trouver_ | — | +| Contrôleur technique PL | CT pendant travaux | _à trouver_ | — | + +Journal des échanges (mail/tél) : noter date, interlocuteur, réponse. +``` + +- [ ] **Step 6: Écrire `20-conception/implantation.md`** + +```markdown +# Implantation / zoning + +Contraintes d'entrée : + +- 9 places assises (conducteur inclus) — position à définir (avant ?). +- 1 cabine de douche (proche réservoirs → minimiser les longueurs d'eau). +- Zone électronique/proto : établi, lumière, assis. +- Zone fab numérique : imprimantes 3D, laser (extraction vers baie ou + lanterneau dédié), petite CNC (poussières → zone séparable). +- Circulation : accès à tout en roulage arrêté, issues dégagées. +- Répartition des masses : lourd (batteries, eau, machines) centré et + bas, équilibré gauche/droite — voir `suivi-poids.md`. + +## Plan + +_Relevé coté de l'intérieur vidé à faire, puis plan (papier scanné ou +CAD) déposé ici._ + +## Versions de zoning + +| Version | Date | Description | Verdict | +|---------|------|-------------|---------| +| v0 | _—_ | _premier jet_ | _—_ | +``` + +- [ ] **Step 7: Écrire `20-conception/suivi-poids.md`** + +```markdown +# Suivi de poids — LE document critique du VASP + +Règle (cf. CLAUDE.md) : tout ajout > 5 kg s'inscrit ici. + +## Point zéro + +| Donnée | Valeur | Source | +|--------|--------|--------| +| PTAC | _à relever (CG F.2)_ | carte grise | +| PV pesé à vide | _pesée à faire_ | ticket de pesée | +| Budget masse aménagement | PTAC − PV − marge 10 % PTAC | calcul | + +## Registre des masses + +| Date | Poste | Domaine | Masse (kg) | Position (av/ar, G/D) | Cumul (kg) | +|------|-------|---------|-----------:|----------------------|-----------:| +| — | — | — | — | — | 0 | + +## Estimations à venir (avant achat) + +| Poste | Estimation (kg) | +|-------|----------------:| +| Isolation + habillage | _—_ | +| Parc batteries | _—_ | +| Eau (pleins) | 1 kg/L × volume | +| Machines (cf. `../60-machines/inventaire.md`) | _—_ | +| Mobilier + établis | _—_ | +| 9 sièges + ancrages | _—_ | +``` + +- [ ] **Step 8: Créer le dossier photos et committer** + +Run: `cd /Users/electron/Documents/BUS && mkdir -p 00-vehicule/photos && touch 00-vehicule/photos/.gitkeep && git add 00-vehicule 10-reglementaire 20-conception && git commit -m "docs: seed vehicle, regulatory, design domains"` +Expected: commit avec 8 fichiers créés. + +--- + +### Task 3: Domaines 30-energie-elec (+ KiCad), 40-fluides + +**Files:** +- Create: `30-energie-elec/bilan-puissance.md` +- Create: `30-energie-elec/architecture.md` +- Create: `30-energie-elec/kicad/bus-elec/bus-elec.kicad_pro` +- Create: `30-energie-elec/kicad/bus-elec/bus-elec.kicad_sch` +- Create: `40-fluides/eau.md` +- Create: `40-fluides/chauffage.md` +- Create: `40-fluides/ventilation.md` + +**Interfaces:** +- Consumes: `20-conception/suivi-poids.md` (Task 2) — les masses batteries/eau y sont reportées. +- Produces: projet KiCad `30-energie-elec/kicad/bus-elec/` (schémas de distribution à venir). + +- [ ] **Step 1: Écrire `30-energie-elec/bilan-puissance.md`** + +```markdown +# Bilan de puissance + +Les machines de fab numérique dimensionnent le système — les remplir en +premier. Puissances à relever sur plaques/manuels, usage réaliste. + +## Consommateurs 230 V + +| Équipement | P max (W) | P moyenne (W) | h/jour type | Wh/jour | +|------------|----------:|--------------:|------------:|--------:| +| Découpe laser | _—_ | _—_ | _—_ | _—_ | +| Imprimante(s) 3D | _—_ | _—_ | _—_ | _—_ | +| Petite CNC | _—_ | _—_ | _—_ | _—_ | +| Stations de soudage | _—_ | _—_ | _—_ | _—_ | +| PC / écrans | _—_ | _—_ | _—_ | _—_ | +| **Total** | | | | _—_ | + +## Consommateurs basse tension (12/48 V) + +| Équipement | P (W) | h/jour | Wh/jour | +|------------|------:|-------:|--------:| +| Éclairage LED | _—_ | _—_ | _—_ | +| Ventilation / extraction | _—_ | _—_ | _—_ | +| Pompe à eau (douche) | _—_ | _—_ | _—_ | +| Chauffage (électronique de commande) | _—_ | _—_ | _—_ | +| **Total** | | | _—_ | + +## Scénarios + +- **Autonome** (batterie + solaire) : dimensionne parc + PV. +- **Raccordé** (P17/16 A sur site) : la batterie ne couvre que l'appoint. +- Arbitrage documenté dans `architecture.md` + `DECISIONS.md`. +``` + +- [ ] **Step 2: Écrire `30-energie-elec/architecture.md`** + +```markdown +# Architecture électrique (draft) + +Découpage prévu — chaque bloc aura son schéma KiCad (`kicad/bus-elec/`) : + +1. **Entrée secteur** : prise extérieure P17, disjoncteur d'entrée, + inverseur de source (secteur / convertisseur). +2. **Parc batterie cellule** (chimie et tension bus DC à décider : + 12 V vs 48 V — 48 V favorable vu les puissances atelier). +3. **Charge** : chargeur secteur + MPPT solaire (+ éventuel DC-DC depuis + l'alternateur, isolé du circuit véhicule). +4. **Conversion** : convertisseur/chargeur 230 V (dimensionné par le + bilan de puissance, pics laser/CNC compris). +5. **Distribution BT** : tableau fusibles, coupe-batterie, bus barre. +6. **Distribution 230 V** : tableau avec différentiel 30 mA + disjoncteurs + par zone (établi élec / machines / douche-zones humides). +7. **Monitoring** : shunt + BMS, affichage (SOC, courants) — terrain de + jeu maison (cf. KXKM Parallelator). + +Règles VASP : circuit cellule séparé du véhicule, protections +documentées, coupe-batterie accessible (cf. `../10-reglementaire/`). + +Chaque choix (chimie, tension, marques) → `DECISIONS.md` + masses → +`../20-conception/suivi-poids.md`. +``` + +- [ ] **Step 3: Créer le squelette KiCad** + +Créer `30-energie-elec/kicad/bus-elec/bus-elec.kicad_pro` : + +```json +{ + "meta": { + "filename": "bus-elec.kicad_pro", + "version": 3 + }, + "sheets": [ + [ + "e63e39d7-6ac0-4ffd-8aa3-1841a4541b55", + "Root" + ] + ] +} +``` + +Créer `30-energie-elec/kicad/bus-elec/bus-elec.kicad_sch` : + +``` +(kicad_sch + (version 20250114) + (generator "eeschema") + (generator_version "9.0") + (uuid "e63e39d7-6ac0-4ffd-8aa3-1841a4541b55") + (paper "A3") + (title_block + (title "Bus Axer - distribution electrique cellule") + (company "L'Electron Rare") + (comment 1 "Draft - architecture voir architecture.md") + ) +) +``` + +- [ ] **Step 4: Écrire `40-fluides/eau.md`** + +```markdown +# Eau — douche + +Un seul point d'eau (cabine de douche) → circuit simple. + +| Élément | Choix | Masse pleine | Statut | +|---------|-------|-------------:|--------| +| Réservoir eau propre | _volume à décider (douche seule : 80–120 L ?)_ | 1 kg/L | à décider | +| Réservoir eaux grises | ≥ volume utile douche | idem | à décider | +| Pompe + accumulateur | _—_ | — | à décider | +| Chauffe-eau | _électrique ? échangeur chauffage ?_ | — | à décider | +| Antigel / vidange | vannes point bas | — | à prévoir | + +Questions réglementaires (eaux grises en VASP atelier) → +`../10-reglementaire/parcours-vasp.md`. Masses → suivi-poids. +``` + +- [ ] **Step 5: Écrire `40-fluides/chauffage.md`** + +```markdown +# Chauffage + +Besoin : hors-gel permanent (machines, électronique, eau) + confort en +séance de travail. Options à instruire : + +| Option | + | − | +|--------|---|---| +| Air pulsé gasoil (type Airtronic/chinois) | autonome, réservoir véhicule | bruit, conso élec au démarrage | +| Poêle (bois/pellet) | ambiance, hors réseau | homologation VASP délicate, place | +| Électrique (secteur uniquement) | simple, propre | inutilisable en autonome | + +Piste probable : gasoil pour la base + appoint électrique si raccordé. +Décision → `DECISIONS.md`, conso → bilan-puissance, masse → suivi-poids. +``` + +- [ ] **Step 6: Écrire `40-fluides/ventilation.md`** + +```markdown +# Ventilation / extraction — sécurité prioritaire + +## Extraction process (obligatoire) + +- **Laser** : extraction dédiée vers l'extérieur (fumées toxiques), + gaine rigide, filtration éventuelle, asservie à la machine. +- **Impression 3D** : caisson ventilé ou extraction (UFP/COV). +- **CNC / poussières** : aspiration copeaux localisée, zone séparable. + +## Renouvellement d'air général + +- VMC ou lanterneau extracteur + entrées d'air basses. +- Douche : extraction humidité. + +## Points d'attention + +- Percements carrosserie = points d'étanchéité (à tracer dans le + journal de chantier avec photos). +- Débits et conso élec → `../30-energie-elec/bilan-puissance.md`. +``` + +- [ ] **Step 7: Committer** + +Run: `cd /Users/electron/Documents/BUS && git add 30-energie-elec 40-fluides && git commit -m "docs: seed energy and fluids domains"` +Expected: commit avec 7 fichiers. + +--- + +### Task 4: Domaines 50-amenagement, 60-machines, 70-chantier, 80-budget + +**Files:** +- Create: `50-amenagement/isolation.md` +- Create: `50-amenagement/mobilier.md` +- Create: `50-amenagement/sieges.md` +- Create: `60-machines/inventaire.md` +- Create: `60-machines/fixations.md` +- Create: `70-chantier/journal/2026-07-09-lancement-projet.md` +- Create: `70-chantier/photos/.gitkeep` +- Create: `80-budget/budget-previsionnel.md` +- Create: `80-budget/depenses.csv` +- Create: `80-budget/devis/.gitkeep` + +**Interfaces:** +- Consumes: `suivi-poids.md` (Task 2), `bilan-puissance.md` (Task 3). +- Produces: `70-chantier/journal/` — source de contenu du blog (Task 6) ; `80-budget/depenses.csv` avec l'en-tête exact `date,domaine,fournisseur,description,montant_eur,facture`. + +- [ ] **Step 1: Écrire `50-amenagement/isolation.md`** + +```markdown +# Isolation + +Objectif : atelier utilisable été/hiver, condensation maîtrisée +(électronique + machines + douche = humidité). + +| Zone | Matériau envisagé | Épaisseur | Statut | +|------|-------------------|-----------|--------| +| Parois | _laine de bois ? liège ? Armaflex ?_ | _—_ | à décider | +| Plafond | _—_ | _—_ | à décider | +| Plancher | _—_ | _—_ | à décider | +| Baies (surface vitrée énorme sur un Axer) | _conserver ? obturer ? survitrage ?_ | _—_ | à décider | + +Points durs : ponts thermiques structure, pare-vapeur (douche !), +masse totale → suivi-poids. Traitement anticorrosion avant pose. +``` + +- [ ] **Step 2: Écrire `50-amenagement/mobilier.md`** + +```markdown +# Mobilier + +Principes : léger (poids !), modulaire, tout arrimé en roulage. + +| Meuble | Zone | Masse est. | Statut | +|--------|------|-----------:|--------| +| Établi électronique | zone proto | _—_ | à concevoir | +| Rangement composants (tiroirs) | zone proto | _—_ | à concevoir | +| Support machines | zone fab | _—_ | à concevoir | +| Vestiaire / rangement EPI | entrée | _—_ | à concevoir | + +Matériaux envisagés : contreplaqué peuplier/bouleau, profilé alu +(2020/3030 — cohérent avec l'outillage maison). +``` + +- [ ] **Step 3: Écrire `50-amenagement/sieges.md`** + +```markdown +# 9 places assises homologuées + +Point réglementaire majeur (cf. `../10-reglementaire/`). + +- Conducteur inclus dans les 9. +- Options : conserver des sièges d'origine (ancrages existants = + simplicité) vs sièges rapportés (ancrages à faire homologuer, R14). +- Ceintures obligatoires selon configuration. +- Position dans le zoning : `../20-conception/implantation.md`. + +| # | Siège | Origine/rapporté | Ancrage | Ceinture | Statut | +|---|-------|------------------|---------|----------|--------| +| 1 (conducteur) | d'origine | origine | origine | origine | OK | +| 2–9 | _—_ | _—_ | _—_ | _—_ | à décider | +``` + +- [ ] **Step 4: Écrire `60-machines/inventaire.md`** + +```markdown +# Parc machines + +Chaque machine : masse (→ suivi-poids), puissance (→ bilan-puissance), +emplacement (→ implantation), arrimage (→ fixations.md). + +| Machine | Masse (kg) | P max (W) | Emplacement prévu | Extraction | Statut | +|---------|-----------:|----------:|-------------------|------------|--------| +| Découpe laser | _—_ | _—_ | _—_ | obligatoire | à définir | +| Imprimante 3D #1 | _—_ | _—_ | _—_ | caisson | à définir | +| Petite CNC | _—_ | _—_ | _—_ | aspiration | à définir | +| Établi élec (stations, alim, oscillo) | _—_ | _—_ | zone proto | — | à définir | +``` + +- [ ] **Step 5: Écrire `60-machines/fixations.md`** + +```markdown +# Arrimage en roulage + +Exigence sécurité + conformité VASP : rien ne bouge, freinage d'urgence +compris (ordre de grandeur : retenue ≥ 0,8 g vers l'avant). + +Principes : +- Machines lourdes : fixation traversante sur structure plancher + (pas sur le seul habillage), platines réparties. +- Petit matériel : bacs fermés, sangles, tiroirs verrouillés. +- Check-list « départ » à afficher dans le bus (à rédiger ici quand + l'aménagement se précise). +``` + +- [ ] **Step 6: Écrire le premier journal de chantier `70-chantier/journal/2026-07-09-lancement-projet.md`** + +```markdown +# 2026-07-09 — Lancement du projet + +Création du workspace : structure documentaire, roadmap 5 ans, registre +de décisions, blog de chantier (https://bus.saillant.cc). + +État du bus : acquis, intérieur vidé. Prochaines actions concrètes : + +1. Pesée du bus vidé (point zéro du suivi de poids). +2. Relevé coté de l'intérieur. +3. Premier contact DREAL sur le parcours VASP atelier ≤ 9 places. +``` + +- [ ] **Step 7: Écrire `80-budget/budget-previsionnel.md`** + +```markdown +# Budget prévisionnel (par domaine) + +Horizon 5 ans, à affiner à mesure que la conception avance. Les montants +réels vont dans `depenses.csv`. + +| Domaine | Enveloppe estimée (€) | Notes | +|---------|----------------------:|-------| +| Réglementaire (pesée, RTI, CT) | _—_ | | +| Isolation + habillage | _—_ | | +| Énergie/élec (batteries, solaire, convertisseur, tableau) | _—_ | poste lourd | +| Fluides (eau, chauffage, ventilation) | _—_ | | +| Mobilier / aménagement | _—_ | | +| Sièges + ancrages | _—_ | | +| Machines (si achats dédiés) | _—_ | | +| Imprévus (15 %) | _—_ | | +| **Total** | _—_ | | +``` + +- [ ] **Step 8: Créer `80-budget/depenses.csv`** + +```csv +date,domaine,fournisseur,description,montant_eur,facture +``` + +- [ ] **Step 9: Créer les dossiers et committer** + +Run: `cd /Users/electron/Documents/BUS && mkdir -p 70-chantier/photos 80-budget/devis && touch 70-chantier/photos/.gitkeep 80-budget/devis/.gitkeep && git add 50-amenagement 60-machines 70-chantier 80-budget && git commit -m "docs: seed fitout, machines, log, budget domains"` +Expected: commit avec 10 fichiers. + +--- + +### Task 5: Remote Gitea `electron-rare/bus-axer` + push + +**Files:** +- Modify: `.git/config` (ajout remote, via commande git) + +**Interfaces:** +- Consumes: token Gitea dans `~/.git-credentials` (helper `store` global déjà configuré). +- Produces: remote `origin` = `https://electron@git.saillant.cc/electron-rare/bus-axer.git`, branche `main` poussée et trackée. + +- [ ] **Step 1: Extraire le token et créer le repo via l'API Gitea** + +```bash +TOKEN=$(grep 'git.saillant.cc' ~/.git-credentials | head -1 | sed -E 's#https://[^:]+:([^@]+)@.*#\1#') +curl -sf -X POST "https://git.saillant.cc/api/v1/orgs/electron-rare/repos" \ + -H "Authorization: token $TOKEN" -H "Content-Type: application/json" \ + -d '{"name":"bus-axer","description":"Irisbus Axer - atelier mobile (VASP, blog bus.saillant.cc)","private":false}' | head -c 300 +``` + +Expected: JSON avec `"full_name":"electron-rare/bus-axer"`. Si HTTP 409, le repo existe déjà — vérifier avec `curl -sf -H "Authorization: token $TOKEN" https://git.saillant.cc/api/v1/repos/electron-rare/bus-axer` qu'il est vide avant de continuer ; s'il n'est pas vide, STOP et demander à l'utilisateur. + +- [ ] **Step 2: Ajouter le remote et pousser** + +```bash +cd /Users/electron/Documents/BUS +git remote add origin https://electron@git.saillant.cc/electron-rare/bus-axer.git +git push -u origin main +``` + +Expected: push accepté (le `electron@` dans l'URL évite la réécriture `insteadOf` vers SSH). + +- [ ] **Step 3: Vérifier** + +Run: `git ls-remote origin main` +Expected: une ligne avec le SHA du dernier commit local (`git rev-parse main` identique). + +--- + +### Task 6: Blog Hugo + thème terminal-bus vendored + +**Files:** +- Create: `blog/hugo.toml` +- Create: `blog/themes/terminal-bus/theme.toml` +- Create: `blog/themes/terminal-bus/layouts/baseof.html` +- Create: `blog/themes/terminal-bus/layouts/home.html` +- Create: `blog/themes/terminal-bus/layouts/page.html` +- Create: `blog/themes/terminal-bus/layouts/section.html` +- Create: `blog/themes/terminal-bus/static/css/terminal.css` +- Create: `blog/content/posts/2026-07-09-le-projet.md` +- Create: `blog/content/a-propos.md` + +**Interfaces:** +- Consumes: matière du journal `70-chantier/journal/` (Task 4). +- Produces: site buildable par `hugo --source blog` → `blog/public/` (consommé par `deploy.sh`, Task 8). `blog/public/` et `blog/resources/` sont déjà dans `.gitignore`. + +- [ ] **Step 1: Vérifier/installer Hugo** + +Run: `command -v hugo || brew install hugo; hugo version` +Expected: version Hugo ≥ 0.146 (layouts « new style » : `layouts/baseof.html` sans sous-dossier `_default`). Si la version installée est plus ancienne, placer les layouts dans `blog/themes/terminal-bus/layouts/_default/` avec les noms classiques (`baseof.html`, `single.html`, `list.html`, `index.html` à la racine de `layouts/`). + +- [ ] **Step 2: Écrire `blog/hugo.toml`** + +```toml +baseURL = "https://bus.saillant.cc/" +languageCode = "fr-fr" +title = "bus.saillant.cc" +theme = "terminal-bus" +timeZone = "Europe/Paris" + +[params] + description = "Chantier d'un Irisbus Axer transformé en atelier/labo mobile — électronique, fab numérique, VASP." + prompt = "electron@bus" + +[permalinks] + posts = "/:year/:month/:slug/" + +[markup.goldmark.renderer] + unsafe = true +``` + +- [ ] **Step 3: Écrire `blog/themes/terminal-bus/theme.toml`** + +```toml +name = "terminal-bus" +license = "MIT" +description = "Thème terminal/hackerspace minimal, vendored, zéro dépendance." +min_version = "0.146.0" +``` + +- [ ] **Step 4: Écrire `blog/themes/terminal-bus/layouts/baseof.html`** + +```html + + + + + +{{ if not .IsHome }}{{ .Title }} — {{ end }}{{ site.Title }} + + + + +
+ + +
+
+{{ block "main" . }}{{ end }} +
+ + + +``` + +- [ ] **Step 5: Écrire `blog/themes/terminal-bus/layouts/home.html`** + +```html +{{ define "main" }} +

{{ site.Params.description }}

+

$ ls -lt posts/

+ +{{ end }} +``` + +- [ ] **Step 6: Écrire `blog/themes/terminal-bus/layouts/page.html`** + +```html +{{ define "main" }} +
+

$ cat {{ path.Base .File.Path }}

+ {{ with .Date }}

# {{ .Format "2006-01-02" }}

{{ end }} + {{ .Content }} +
+{{ end }} +``` + +- [ ] **Step 7: Écrire `blog/themes/terminal-bus/layouts/section.html`** + +```html +{{ define "main" }} +

$ ls {{ .Section }}/

+ +{{ end }} +``` + +- [ ] **Step 8: Écrire `blog/themes/terminal-bus/static/css/terminal.css`** + +```css +:root { + --bg: #0d1117; + --fg: #c9d1d9; + --green: #3fb950; + --amber: #d29922; + --dim: #8b949e; + --border: #30363d; +} +* { box-sizing: border-box; } +body { + background: var(--bg); + color: var(--fg); + font-family: "JetBrains Mono", "Fira Code", ui-monospace, "SF Mono", + Menlo, monospace; + font-size: 15px; + line-height: 1.6; + max-width: 80ch; + margin: 0 auto; + padding: 1.5rem 1rem 4rem; +} +.banner { color: var(--green); font-size: 12px; line-height: 1.2; + overflow-x: auto; } +.prompt { color: var(--green); font-weight: bold; } +nav a, footer a { margin-right: 1.5ch; } +a { color: var(--amber); text-decoration: none; } +a:hover { text-decoration: underline; background: var(--amber); + color: var(--bg); } +h1, h2, h3 { color: var(--green); font-size: 1.1em; margin-top: 2em; } +h1 { font-size: 1.25em; } +.date { color: var(--dim); margin-right: 2ch; } +.post-list { list-style: none; padding: 0; } +.post-list li { padding: 0.2em 0; } +img { max-width: 100%; border: 1px solid var(--border); } +pre, code { background: #161b22; } +pre { padding: 1em; overflow-x: auto; border: 1px solid var(--border); } +code { padding: 0.1em 0.4ch; } +pre code { padding: 0; } +blockquote { border-left: 3px solid var(--green); margin-left: 0; + padding-left: 1.5ch; color: var(--dim); } +table { border-collapse: collapse; width: 100%; } +th, td { border: 1px solid var(--border); padding: 0.3em 1ch; + text-align: left; } +hr { border: 0; border-top: 1px dashed var(--border); } +footer { margin-top: 4rem; color: var(--dim); font-size: 0.85em; } +``` + +- [ ] **Step 9: Écrire le premier billet `blog/content/posts/2026-07-09-le-projet.md`** + +```markdown +--- +title: "Le projet : un Irisbus Axer devient atelier mobile" +date: 2026-07-09 +slug: "le-projet" +--- + +Un bus. Un vrai, un Irisbus Axer, déjà vidé de ses sièges. Destination : +**atelier / labo mobile** — électronique et prototypage d'un côté, +fabrication numérique de l'autre (imprimantes 3D, découpe laser, petite +CNC). Plus une cabine de douche et 9 places assises, parce qu'un atelier +qui ne peut pas emmener son équipe ne sert à rien. + +Côté paperasse, l'objectif est une reclassification **VASP atelier +≤ 9 places** : conduite au permis C, sortie du régime transport en +commun. Ça impose de penser réglementaire *avant* de visser quoi que ce +soit — ancrages de sièges, circuit électrique séparé, suivi de poids par +essieu tenu depuis le premier jour. + +L'horizon est assumé : **5 ans**. Année 1 : conception, pesée, isolation. +Ensuite l'énergie, les fluides, l'aménagement, les machines, et le +passage DREAL en bout de course. + +Ce blog racontera le chantier — les plans, les ratés, les pesées, les +schémas. Tout le projet est versionné dans un dépôt git, y compris ce +billet. + +Prochaine étape : peser le bus vide. Point zéro. +``` + +- [ ] **Step 10: Écrire `blog/content/a-propos.md`** + +```markdown +--- +title: "À propos" +slug: "a-propos" +--- + +Chantier de transformation d'un Irisbus Axer en atelier/labo mobile, +mené par L'Electron Rare. Électronique, fabrication numérique, une +douche, 9 places, et un objectif VASP au bout de 5 ans. + +Contact : clement@saillant.cc +``` + +- [ ] **Step 11: Builder et vérifier** + +Run: `cd /Users/electron/Documents/BUS && hugo --source blog --minify && ls blog/public/index.html blog/public/2026/07/le-projet/index.html` +Expected: build sans erreur, les deux fichiers HTML existent. Ouvrir un aperçu local si souhaité : `hugo server --source blog` → http://localhost:1313. + +- [ ] **Step 12: Committer** + +Run: `cd /Users/electron/Documents/BUS && git add blog && git commit -m "feat: add Hugo blog with terminal-bus theme"` +Expected: commit créé, `blog/public/` absent du commit (gitignoré). + +--- + +### Task 7: Hébergement Tower + route bus.saillant.cc + +**Files:** +- Create (sur Tower): `/home/clems/bus-blog/public/` (répertoire servi) +- Modify (selon investigation) : ingress cloudflared **ou** config Traefik edge sur electron-server + +**Interfaces:** +- Consumes: `blog/public/` buildé (Task 6). +- Produces: nginx `bus-blog` sur Tower `:8090` servant `/home/clems/bus-blog/public`, atteignable depuis electron-server ; `https://bus.saillant.cc` publique. + +- [ ] **Step 1: Investiguer l'infra de routage `*.saillant.cc`** + +```bash +# Mémoires de référence (routage actuel, tunnel cloudflared, état edge) +ls ~/.claude/projects/-Users-electron/memory/ | grep -Ei 'cloudflared|git_saillant' +cat ~/.claude/projects/-Users-electron/memory/reference_cloudflared_tunnel_saillant.md +# État réel sur electron-server (Traefik edge + cloudflared ?) +ssh electron@100.78.191.52 'docker ps --format "table {{.Names}}\t{{.Ports}}" | grep -Ei "traefik|cloudflared" ; ls /home/electron/edge/' +``` + +Expected: identifier si `*.saillant.cc` passe par le tunnel cloudflared (ingress à modifier via API CF) ou par Traefik 3 (`/home/electron/edge/docker-compose.yml` + DNS). Noter le mécanisme retenu dans `DECISIONS.md` (entrée « Exposition bus.saillant.cc »). + +- [ ] **Step 2: Vérifier Docker et le port 8090 sur Tower** + +```bash +ssh clems@192.168.0.120 'docker --version && (ss -tlnp | grep -w 8090 || echo PORT_8090_LIBRE)' +``` + +Expected: Docker présent, `PORT_8090_LIBRE`. Si le port est pris, choisir 8091+ et reporter le choix partout (nginx, route, deploy.sh, CLAUDE.md). + +- [ ] **Step 3: Lancer nginx statique sur Tower (image pinnée par digest)** + +```bash +ssh clems@192.168.0.120 ' + mkdir -p /home/clems/bus-blog/public && + docker pull nginx:1.27-alpine && + DIGEST=$(docker inspect --format "{{index .RepoDigests 0}}" nginx:1.27-alpine) && + echo "Digest: $DIGEST" && + docker run -d --name bus-blog --restart unless-stopped \ + -p 8090:80 \ + -v /home/clems/bus-blog/public:/usr/share/nginx/html:ro \ + "$DIGEST" +' +``` + +Expected: container `bus-blog` démarré. Consigner le digest dans `DECISIONS.md` (traçabilité supply-chain). + +- [ ] **Step 4: Smoke test local Tower** + +```bash +ssh clems@192.168.0.120 'echo "

bus-blog ok

" > /home/clems/bus-blog/public/index.html && curl -s http://localhost:8090/ | head -1' +``` + +Expected: `

bus-blog ok

`. Vérifier aussi depuis electron-server (chemin qu'empruntera la route) : `ssh electron@100.78.191.52 'curl -s http://100.78.6.122:8090/ | head -1'`. + +- [ ] **Step 5: Ajouter la route publique `bus.saillant.cc` (branche selon Step 1)** + +**Branche A — cloudflared** : suivre `reference_cloudflared_tunnel_saillant.md` — ajouter au tunnel `2c6b04a3…` une règle ingress `bus.saillant.cc → http://100.78.6.122:8090` via l'API CF (endpoint `cfd_tunnel//configurations`, PUT du tableau ingress complet avec la nouvelle entrée AVANT le catch-all 404) + créer le DNS CNAME `bus` → `.cfargotunnel.com` (proxied). + +**Branche B — Traefik edge** : sur electron-server, ajouter au compose `/home/electron/edge/docker-compose.yml` (ou à sa config dynamique si un dossier `dynamic/` existe) un routeur+service : + +```yaml +# fragment config dynamique Traefik (fichier ou labels selon l'existant) +http: + routers: + bus-blog: + rule: "Host(`bus.saillant.cc`)" + entryPoints: ["websecure"] + tls: + certResolver: letsencrypt + service: bus-blog + services: + bus-blog: + loadBalancer: + servers: + - url: "http://100.78.6.122:8090" +``` + +puis créer l'enregistrement DNS `bus.saillant.cc` → même cible que `git.saillant.cc` (A/CNAME identique), et recharger Traefik (`docker compose -f /home/electron/edge/docker-compose.yml up -d`). **Adapter le fragment à la structure réellement trouvée** (resolver name, entrypoint) en copiant le pattern du routeur `git.saillant.cc` existant. + +- [ ] **Step 6: Vérifier la route publique** + +Run: `curl -sI https://bus.saillant.cc/ | head -5` +Expected: `HTTP/2 200` avec le contenu du smoke test. La propagation DNS peut prendre quelques minutes — réessayer avant de conclure à un échec. + +--- + +### Task 8: deploy.sh + premier déploiement end-to-end + +**Files:** +- Create: `blog/deploy.sh` (exécutable) + +**Interfaces:** +- Consumes: site Hugo (Task 6), nginx Tower + route (Task 7). +- Produces: commande unique de publication `blog/deploy.sh`. + +- [ ] **Step 1: Écrire `blog/deploy.sh`** + +```bash +#!/usr/bin/env bash +# Publish the blog to Tower (nginx :8090 -> https://bus.saillant.cc) +set -euo pipefail +cd "$(dirname "$0")" + +TOWER="clems@192.168.0.120" +DEST="/home/clems/bus-blog/public/" + +echo "==> hugo build" +hugo --minify --cleanDestinationDir + +echo "==> rsync to $TOWER:$DEST" +rsync -az --delete public/ "$TOWER:$DEST" + +echo "==> smoke test" +curl -sfI https://bus.saillant.cc/ >/dev/null \ + && echo "OK: https://bus.saillant.cc" \ + || { echo "WARN: public URL not reachable (DNS/route?)"; exit 1; } +``` + +- [ ] **Step 2: Rendre exécutable et déployer** + +Run: `chmod +x /Users/electron/Documents/BUS/blog/deploy.sh && /Users/electron/Documents/BUS/blog/deploy.sh` +Expected: build OK, rsync OK, `OK: https://bus.saillant.cc`. + +- [ ] **Step 3: Vérifier le contenu publié** + +Run: `curl -s https://bus.saillant.cc/ | grep -o "le-projet" | head -1 && curl -sI https://bus.saillant.cc/css/terminal.css | head -1` +Expected: `le-projet` trouvé sur la home, CSS servi en 200. + +- [ ] **Step 4: Committer et pousser** + +```bash +cd /Users/electron/Documents/BUS +git add blog/deploy.sh +git commit -m "feat: add blog deploy script" +git push +``` + +Expected: push OK sur `electron-rare/bus-axer`. + +- [ ] **Step 5: Mettre à jour DECISIONS.md avec les choix d'infra réels** + +Ajouter en haut de `DECISIONS.md` une entrée « 2026-07-09 — Exposition bus.saillant.cc » documentant : mécanisme retenu (cloudflared ou Traefik), port Tower réel, digest nginx pinné. Puis : + +```bash +git add DECISIONS.md && git commit -m "docs: record blog infra decisions" && git push +``` + +Expected: push OK.