Conclusion d'abord : avec Claude Fable 5 nous avons livré pulsecheck, un CLI qui vérifie en lot si une liste d'URL/API répond encore et écrit un rapport JSON prêt pour cron ou alertes. L'article se lit en deux temps : d'abord à quoi sert l'outil et à quoi ressemble le résultat (capture ci-dessous) ; ensuite les sept étapes où l'IA a écrit du code et où un humain doit trancher dans Claude Code. Pour juger l'utilité, la capture suffit ; pour reproduire, commencez à l'étape 1.
À quoi sert pulsecheck ?
En une phrase : il sonde en masse des URLs sans ouvrir dix onglets ni enchaîner les curl à la main.
Cas typique : vous listez dans config.yaml les endpoints de prod (/health, /ping), cron toutes les 5 minutes. Si une API renvoie 503 ou time-out, le code de sortie passe à 1 et votre script d'alerte ou votre superviseur réagit. C'est une sonde légère, pas Datadog — pas de dashboard, pas de SMS : seulement « cette liste est-elle vivante maintenant ? » en JSON.
Trois scénarios concrets
Oubliez Go et YAML une seconde : le problème, c'est « comment savoir si ces services répondent encore ». Trois situations où pulsecheck se justifie :
- Patrouille planifiée — Vous avez 5 à 20 URLs de health check (webhooks paiement, API publiques, passerelle interne). Un script shell
for url in …; do curl …devient vite ingérable. pulsecheck lit un fichier, sort un JSON structuré, cron fait le reste. - Avant release ou astreinte — Une commande :
./pulsecheck -config prod.yaml -o /tmp/pre-deploy.json. Code 0 : vous déployez ; code 1 : vous stoppez. - Sonde pour alertes existantes — Sans Prometheus complet, le code de sortie déclenche votre Webhook ou mail ; le JSON sert à l'analyse après coup.
Hors périmètre : tendances historiques, SMS, console multi-tenant — là, un vrai observability stack. pulsecheck ne répond qu'à maintenant, cette liste est-elle OK ?
Capture du produit fini
Voici pulsecheck une fois terminé dans un terminal Mac : lecture config, sondes, JSON écrit ; un site renvoie 503 donc le code de sortie est 1.
./pulsecheck -config config.example.yaml -o report.json ; à droite : report.json avec status_code, latence et champ ok par URL.Trois commandes pour reproduire chez vous :
./pulsecheck -config config.example.yaml -o report.json echo $? # 1 = au moins une cible KO cat report.json # lire le rapport
Entrées, sorties, stack
Techniquement, voyez curl en rafale + rapport unique, compilé en binaire pour cron.
| Dimension | Détail | Exemple |
|---|---|---|
| Entrée | YAML listant les URL à sonder | config.example.yaml |
| Sortie | Rapport JSON + code de sortie process | report.json ; 0=tout vert, 1=échec |
| Usage | Cron, pré-release, branchement alerte | */5 * * * * pulsecheck … |
| Stack | Go 1.22, binaire unique | Pas de GUI ni base |
Vous ne maintenez qu'un YAML ; le reste est automatique :
targets: - https://api.example.com/health - https://status.example.com/ping
Dépôt final ~400 lignes Go :
pulsecheck/ ├── cmd/pulsecheck/main.go # -config -o ├── internal/checker/checker.go # HTTP + latence ├── internal/config/config.go # parse YAML ├── config.example.yaml ├── Makefile · README.md └── .github/workflows/ci.yml
Ce que l'IA écrit dans les 7 étapes
Vous savez ce qu'est pulsecheck ; place au processus : Claude Fable 5 + Claude Code, dossier vide jusqu'au tag v0.1.0.
Règle simple : l'IA code et teste ; l'humain cadre, review et signe la release. Chaque étape a un prompt copiable ; Fable 5 suffit pour la boucle agent (pas besoin d'Opus — voir comparatif des tiers).
Prérequis
- Go 1.22+ —
go version - Claude Code CLI — modèle Claude Fable 5 (choix de tier)
- Dossier vide —
mkdir pulsecheck && cd pulsecheck && git init - GitHub (optionnel) — pour l'étape 6 CI distante
Étape 1 : dépôt et besoin
Vous : trois phrases de douleur → SPEC.md. L'IA peut développer, mais vous coupez le hors périmètre (sinon UI web et base de données arrivent tout seuls).
Lis le besoin ci-dessous et génère SPEC.md sans ajouter de fonctionnalité : - Outil pulsecheck, CLI Go 1.22 - Lire une liste d'URL YAML, HTTP GET concurrent - Rapport JSON vers -o - Champs : url, status_code, latency_ms, ok - Timeout 5 s par défaut, PULSECHECK_TIMEOUT pour override - Codes : 0 tout vert, 1 échec, 2 erreur config - Hors périmètre : GUI, DB, Docker, push alertes
IA : SPEC.md. Vous : pas de feature en trop ; commande de validation go test ./... mentionnée.
Validation : cat SPEC.md — sections must / non-objectifs / codes présentes.
Étape 2 : squelette
Vous : demander structure seule, pas de métier. Fable 5 gère presque tout.
Lis SPEC.md, init module github.com/you/pulsecheck. Squelette uniquement, logique stub : - cmd/pulsecheck/main.go parse -config et -o - internal/config lit YAML - internal/checker vide - Makefile : test, lint, build - .github/workflows/ci.yml placeholder go build ./... doit passer, pas de vraie HTTP.
IA : ~8 fichiers. Durée observée : ~6 minutes.
Validation :
go build ./... ./pulsecheck -h # aide affichée
Étape 3 : sondes et tests
Vous : imposer tests d'abord, code ensuite. L'agent lance go test, corrige, reboucle — l'étape la plus « vraie projet ».
Dans internal/checker : 1. checker_test.go avec httptest : 200, 500, timeout 2. checker.go : GET, status_code, latency_ms 3. Boucler go test ./... jusqu'au vert 4. main.go : config → checker → JSON vers -o
Extrait typique généré par l'IA :
func CheckURL(ctx context.Context, client *http.Client, url string) Result { start := time.Now() req, _ := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) resp, err := client.Do(req) if err != nil { return Result{URL: url, OK: false, LatencyMs: time.Since(start).Milliseconds()} } defer resp.Body.Close() ok := resp.StatusCode >= 200 && resp.StatusCode < 300 return Result{ URL: url, StatusCode: resp.StatusCode, LatencyMs: time.Since(start).Milliseconds(), OK: ok, } }
En test, Fable 5 a enchaîné 3 tours de go test et a corrigé seul le timeout HTTP non propagé.
Validation : go test ./... -v — 12 cas table-driven verts.
Étape 4 : review
Vous : jouer le reviewer — liste de retours, pas de patch manuel (sinon vous ne testez pas la capacité d'itération de l'agent).
Applique ces retours, go test ./... doit rester vert : 1. Champ JSON latency → latency_ms (SPEC) 2. Worker pool pour URLs, max 10 concurrent par défaut 3. stdout : seulement chemin du rapport ; warns sur stderr
IA : pool, renommage, logs. Vous : décider si ces trois points méritent d'être faits — jugement non déléguable.
Validation : tests verts ; JSON manuel sur une URL réelle.
Étape 5 : config et README
Vous : documentation exploitable par un ops qui copie-colle.
Génère config.example.yaml et README.md : - Install : go install ou go build - Exemples, table codes 0/1/2 - Exemple cron 5 min avec log - Pas de sous-commandes inventées
Validation : URLs réelles dans l'exemple, commandes de la section capture exécutées, champs JSON complets.
Étape 6 : GitHub Actions
Vous : pousser sur GitHub ; l'IA complète le workflow et lit les logs d'échec.
Complète .github/workflows/ci.yml : - go test -race ./... - golangci-lint run - go 1.22 Si lint échoue, lis le log, corrige, recommit.
Premier lint : import inutilisé — Fable 5 a lu le log CI et supprimé. Sur Mac 16 Go, -race peut swapper : déporter vers un runner GitHub ou un nœud Cloud Mac — même logique que le choix d'environnement d'exécution Claude Code.
Validation : CI verte sur GitHub.
Étape 7 : validation et tag
Vous seul : smoke test et tag. L'IA peut brouillonner le CHANGELOG ; la signature release reste humaine.
go test ./... make build ./pulsecheck -config config.example.yaml -o /tmp/report.json cat /tmp/report.json | jq . git add -A && git commit -m "feat: pulsecheck v0.1.0" git tag -a v0.1.0 -m "first release: YAML-driven HTTP health probe" git push && git push --tags
pulsecheck est livré : CLI cronable, ~52 minutes de bout en bout.
Après v0.1
Volontairement absent : alerte Slack, exporter Prometheus, image Docker. Nouvelles issues, nouvelle boucle Fable — fermer la boucle avant d'élargir.
Répartition IA / humain
| Étape | Fable 5 | Humain |
|---|---|---|
| 1 Besoin | Structure le spec oral | Taille le périmètre, codes sortie |
| 2 Squelette | 8 fichiers, build OK | Version Go, nom module |
| 3 Implémentation | Tests + checker + main | Couverture vs SPEC |
| 4 Review | Patches selon liste | Rédige la liste |
| 5 Docs | README + exemple | Exécute copy-paste |
| 6 CI | Workflow + fix lint | Définit « vert » |
| 7 Release | Brouillon CHANGELOG | Smoke + tag |
Environ 78 % du code livrable vient de l'IA ; cadrage, review et tag restent humains quel que soit le modèle.
Matrice de choix
| Si vous êtes… | Approche | Pourquoi |
|---|---|---|
| Premier projet complet avec IA | Ces 7 étapes + validation chaque fois | Plus rapide qu'un débat abstrait sur les modèles |
| Ops / CLI interne type pulsecheck | Go + boucle agent Fable 5 | Tests auto-validants, table-driven |
| SaaS avec données utilisateur | IA brouillon + revue Opus sécurité | Responsabilité release non déléguable |
| Feature sur dépôt existant | Sauter étape 2, entrer par Issue | Squelette déjà là |
| Mac 16 Go + CI longue | Agent local, race sur Cloud Mac | Éviter swap confondu avec lenteur modèle |
| Demo patron sous une semaine | SPEC hors périmètre verrouillé d'abord | Évite scope creep de l'agent |
Combinaisons recommandées
- Solo — Fable 5 sur étapes 2–6 ; Cursor Tab pour micro-ajustements ; Opus seulement sur surfaces exposées.
- Petite équipe — Template dépôt avec checklist sept phases ; process dupliqué ; agent sur workflow Claude Code prod.
- Budget tokens — SPEC et CHANGELOG via Gemini Flash ; boucle code Fable 5 ; routing OpenRouter.
Avec MCP : l'agent tire Issues et contexte monitoring, Fable 5 modifie le repo — étape 7 release : signature humaine recommandée.
Pièges fréquents
- Discuter sans objectif projet — l'IA vague ; fixez « pulsecheck en une phrase » d'abord.
- Métier dès l'étape 2 — squelette et implémentation mélangés, tests difficiles.
- Sauter l'étape 4 — noms JSON, pollution stdout passent en prod.
- Tag sans étape 7 — pas de smoke, pas de release.
- race + agent sur 16 Go — lenteur RAM, pas modèle ; CI sur runner distant.
FAQ
Quel problème pulsecheck résout-il ?
« Cette liste d'URL répond-elle maintenant ? » — sans shell artisanal ni plateforme lourde. Idéal petit équipe ou pré-release.
Différence avec UptimeRobot ou Prometheus ?
pulsecheck est un CLI sur votre machine, config locale, zéro SaaS ; les autres sont des stacks complètes. Ici : suffisant et modifiable.
Un dépôt public à cloner ?
Article retour d'expérience + tutoriel reproductible ; les sept prompts suffisent, pas besoin d'un diff identique.
Étape la plus « IA » ?
3 (tests + code) et 2 (squelette) ; 1 et 7 surtout humaines.
Vs complétion Cursor Tab ?
Tab = fichier unique ; projet entier = Claude Code multi-fichiers + tests. Voir Copilot vs Cursor.
Conclusion
Produit : pulsecheck — YAML, sondes, report.json (capture plus haut). Process : sept étapes Fable 5, ~78 % du Go par l'IA, humain sur périmètre, review et tag. Pour évaluer « l'IA peut-elle livrer un petit outil ? », la capture et le tableau suffisent ; pour le faire vous-même, copiez l'étape 1.
ZavCloud · Cloud Mac
Lancer la CI de pulsecheck sur Cloud Mac
Mac mini M4 dédié : Claude Code écrit le code, GitHub Actions exécute test -race sur le même nœud macOS — l'étape 6 ne subit pas la RAM locale 16 Go.
Voir tarifs et offres