18/07/2026
Sous le capot : le pipeline de génération

Le pipeline, si nous l'avions construit en bois — GIF via Giphy.
Quand un brief arrive dans notre orchestrateur, six étapes s'enchaînent sans intervention humaine.
1. Duplication
Le socle Piks-l est dupliqué vers un dépôt privé dédié au projet. Historique propre, isolation totale. Un seul appel à l'API GitHub suffit :
await octokit.request('POST /repos/{owner}/{repo}/generate', {
owner: 'piks-l',
repo: 'piks-l-nuxt-template',
name: `client-${slug}`,
private: true,
})2. Génération
Le brief — texte, image ou wireframe — est confié à l'IA avec nos instructions système : stack imposée, conventions de nommage, identité visuelle, format de sortie strict. Ces règles « dures » sont réinjectées à chaque appel, par-dessus les instructions du template : impossible de les diluer dans un long contexte.
3. Validation
Chaque fichier généré est inspecté : schéma de sortie, chemins autorisés, détection de motifs dangereux. Une passe de nettoyage corrige aussi ce que les modèles ratent systématiquement — par exemple les apostrophes françaises dans les chaînes JavaScript à guillemets simples, échappées par un mini-lexer maison. Ce qui ne passe pas n'entre pas.
4. Injection
Les fichiers validés sont poussés en un commit unique, signé par l'orchestrateur, via l'API Git Data : création des blobs, de l'arbre, du commit, puis avance de la référence main — aucun clone local nécessaire.
5. Déploiement
Projet créé, variables injectées, sous-domaine attribué, SSL émis — automatiquement :
await vercel('/v11/projects', {
name: slug,
gitRepository: { type: 'github', repo: `piks-l/client-${slug}` },
})
await vercel(`/v10/projects/${slug}/domains`, { name: `${slug}.piks-l.com` })Si un domaine propre est fourni, l'orchestrateur va jusqu'à écrire l'enregistrement DNS chez le registrar via son API, de façon idempotente : rejouer l'étape ne crée jamais de doublon.
6. Suivi
Chaque étape met à jour le journal de génération, visible en temps réel dans notre console d'administration :
update generation_jobs
set etape = 'deploiement', progression = 83
where id = :job_id;Un échec ne rejoue que l'étape fautive, pas la chaîne entière.
Résultat : un site en ligne en quelques minutes, sur un socle que nous faisons évoluer pour tous nos clients à la fois.
