Files
gitea-dashboard/docs/analyse/workflow-analysis-v1.0.0.md
sylvain 22590d7250 docs(analyse): workflow analysis v1.0.0 — complete breakdown
13 steps, 11 agents, 19 MCP calls, chronology, metrics, recommendations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 19:42:13 +01:00

25 KiB

Analyse complete du workflow — gitea-dashboard v1.0.0

Objectif : documenter chaque etape du workflow macro major-initial tel qu'il s'est deroule, avec les agents, outils et decisions pris a chaque moment, pour pouvoir analyser et ameliorer le workflow.

Projet : gitea-dashboard (dashboard CLI Python pour Gitea) Track : major-initial (1 → 13) Date : 2026-03-10 Duree totale : ~1h17 (18h14 → 19h31) Resultat : v1.0.0 released, 37 tests, audit 97/100


Table des matieres

  1. Vue chronologique
  2. Detail par etape
  3. Agents utilises
  4. Outils MCP et integrations
  5. Metriques finales
  6. Analyse critique
  7. Recommandations

1. Vue chronologique

18h14  ████ Init + Steps 1-3 (framing)                    8 min
18h22  ████████ Step 4 (recherche API)                    17 min
18h39  ██ Steps 5-6 (roadmap + plan)                       5 min
18h44  █████ Step 7 (developpement 4 modules)             11 min
18h55  ████ Step 8 (audit + corrections)                   8 min
19h03  ██ Step 9 (smoke test)                              5 min
19h08  ██████████ Step 10 (documentation)                 21 min
19h29  █ Steps 11+13 (release + retro)                     2 min
19h31  DONE

Observation : la documentation (step 10, 21 min) a pris plus de temps que le developpement (step 7, 11 min). Le framing (steps 1-3) et la release (steps 11-13) sont les phases les plus rapides.


2. Detail par etape

Phase 1 — FRAMING (steps 1-5)

Step 1 — Discovery | 18h14-18h19

Skill/Agent /forge (mode new project, inclut discovery)
Modele opus (orchestrateur principal)
Action Interview reduite (contexte deja fourni par l'utilisateur), challenge de 2 hypotheses (requests vs MCP, filtre repos)
Outils AskUserQuestion (1 question sur le filtre repos)
Livrable docs/discovery/synthesis.md
Decision Tout afficher sans filtre en v1

Deroulement : L'utilisateur avait deja defini clairement le besoin (stack, scope, API). La discovery a ete acceleree : 1 seule question posee au lieu des 5-8 prevues. 2 hypotheses challengees : (1) requests vs client MCP → requests confirme pour autonomie du CLI, (2) filtre par owner → differe.

Analyse : Pour un projet simple et bien defini, la discovery formelle est surdimensionnee. Le temps de redaction du synthesis.md ne se justifie pas quand l'utilisateur a deja tout explicite.


Step 2 — Creation projet | 18h19-18h21

Skill/Agent /forge (mode new project, suite)
Modele opus (orchestrateur principal)
Action Generation de la structure complete du projet
Outils Write (14 fichiers), Read (7 templates), Bash (mkdir, git)
Livrable Structure projet complete

Fichiers crees :

  • CLAUDE.md, .gitignore, README.md, pyproject.toml
  • src/gitea_dashboard/__init__.py, src/gitea_dashboard/cli.py (squelette)
  • tests/__init__.py
  • docs/ (7 fichiers : README, synthesis, descriptif, demandes, ARCHITECTURE, decisions, research)

Incident : Le hook secret-scanner a bloque l'ecriture du README.md car il contenait le mot "token" dans un exemple. Reformulation sans valeur d'exemple → OK.

Analyse : La generation depuis des templates est efficace et coherente. Le hook de securite est un bon garde-fou mais genere un faux positif ici.


Step 3 — Specs | 18h21

Skill/Agent Aucun (validation automatique)
Modele
Action Verification que descriptif.md contient les 4 sections requises
Livrable docs/project/descriptif.md (deja cree au step 2)

Analyse : Step valide automatiquement car le descriptif avait ete cree complet au step 2. Pas de travail supplementaire. Cette etape sert de checkpoint de qualite.


Step 4 — Recherche technique | 18h22-18h28

Skill/Agent researcher
Modele opus
Action Investigation API Gitea REST v1
Outils WebFetch (swagger.json de l'instance), Read, Write
Livrable docs/technical/research.md (164 lignes)
Duree agent ~4.5 min (274s)

Sujets investigues (6) :

  1. Authentification (format header, methodes deprecated)
  2. Endpoints necessaires (4 : /user/repos, /releases/latest, /milestones, /issues)
  3. Pagination (page/limit, headers X-Total-Count et Link)
  4. Strategie d'appels (cout en requetes : ceil(N/50) + 2N)
  5. Cas limites (404 releases, tableaux vides, forks, archives, open_issues inclut PRs)
  6. Decisions recommandees (endpoint repos, comptage issues, affichage forks)

Analyse : Etape tres productive. Le researcher a produit un document exhaustif qui a guide tout le developpement. La decouverte que open_issues_count inclut les PRs (avec open_pr_counter en champ separe) a evite un bug en production. Le swagger de l'instance reelle a ete utilise comme source primaire → donnees fiables.


Step 5 — Roadmap | 18h28-18h39

Skill/Agent Orchestrateur principal (pas d'agent dedie)
Modele opus
Action Creation milestone + issues + labels sur Gitea
Outils MCP mcp__gitea__milestone_write, mcp__gitea__issue_write (x4), mcp__gitea__label_write (x4), mcp__gitea__label_read, mcp__gitea__issue_write.add_labels (x4)
Livrable Milestone v1.0.0 (id:29) + issues #1-#4 + 4 labels

Labels crees :

Label ID Couleur
feature 58 #0075ca
bug 59 #d73a4a
improvement 60 #a2eeef
backlog 61 #e4e669

Issues crees :

# Titre Phase
#1 Client API Gitea avec authentification et pagination Phase 1
#2 Collecte des donnees : repos, issues, releases, milestones Phase 1
#3 Affichage dashboard avec Rich (tableaux, couleurs) Phase 2
#4 Point d'entree CLI et configuration Phase 2

Particularite MCP : Le issue_write(method="create") de Gitea MCP ignore le parametre labels. Il faut un appel separe issue_write(method="add_labels") apres creation. Le workflow documente cette contrainte.

Analyse : L'integration MCP Gitea est fluide pour les operations CRUD simples. 13 appels MCP necessaires (1 milestone + 4 labels + 4 issues + 4 add_labels) pour une etape qui pourrait etre plus compacte.


Phase 2 — DEV (steps 6-8)

Step 6 — Plan de version | 18h39-18h44

Skill/Agent architect
Modele opus
Action Production du plan detaille avec phases, interfaces, budget de scope
Outils Read (5 fichiers contexte), Write (3 fichiers)
Livrable docs/plans/v1.0.0-plan.md, docs/technical/ARCHITECTURE.md, docs/technical/decisions.md (ADR-002, ADR-003)
Duree agent ~3.2 min (194s)

Decisions architecturales :

  • ADR-002 : 4 modules max (client / collector / display / cli)
  • ADR-003 : Pas de parallelisation en v1 (sequentiel, < 20 repos acceptable)

Plan structure :

  • Phase 1 : client.py + collector.py + 2 fichiers tests (fixes #1, #2)
  • Phase 2 : display.py + cli.py (modif) + 2 fichiers tests (fixes #3, #4)
  • Budget : 8 fichiers max (4 modules + 4 tests)

Interfaces definies : signatures de GiteaClient, RepoData dataclass, collect_all(), render_dashboard() — le builder n'a pas eu a decider de l'API.

Incident : L'architect a cree une 2e milestone v1.0.0 (id:30) sur Gitea alors qu'il en existait deja une (id:29). Cause : pas de verification d'existence avant creation. Nettoyage fait au step 9.

Analyse : Le plan est tres detaille (295 lignes) et inclut meme les risques d'audit anticipes. Les interfaces pre-definies accelerent le travail du builder. La section "risques d'audit" s'est revelee presciente (3 des 4 risques identifies se sont retrouves dans les findings reels).


Step 7 — Developpement | 18h44-18h55

Skill/Agent builder (x2, une invocation par phase)
Modele opus
Action Implementation TDD des 4 modules
Outils Read, Write, Edit, Bash (pytest, pip install, ruff)
Livrable 4 modules + 4 fichiers tests, 35 tests passent
Duree agents Phase 1: ~4 min (239s) + Phase 2: ~3 min (181s) = ~7 min

Phase 1 — Client + Collecteur (builder invocation 1) :

  • src/gitea_dashboard/client.py (81 lignes) : GiteaClient, auth, pagination, get_repos, get_latest_release (None sur 404), get_milestones
  • src/gitea_dashboard/collector.py (52 lignes) : dataclass RepoData, collect_all()
  • tests/test_client.py (160 lignes) : 9 tests
  • tests/test_collector.py (130 lignes) : 6 tests
  • 2 commits : feat(client): ... (fixes #1) + feat(collector): ... (fixes #2)
  • 15 tests passent

Correction pyproject.toml : Le builder a detecte et corrige le build-backend (_legacy:_Backendbuild_meta). Bug present depuis la creation au step 2.

Phase 2 — Display + CLI (builder invocation 2) :

  • src/gitea_dashboard/display.py (128 lignes) : render_dashboard(), tableau Rich, milestones, indicateurs [F]/[A]/[M], dates relatives
  • src/gitea_dashboard/cli.py (58 lignes) : main(), lecture env vars, pipeline, gestion erreurs, masquage secret
  • tests/test_display.py (216 lignes) : 12 tests
  • tests/test_cli.py (127 lignes) : 8 tests
  • 2 commits : feat(display): ... (fixes #3) + feat(cli): ... (fixes #4)
  • 35 tests passent (15 + 20)

Ratio tests/code : 633 lignes de tests / 325 lignes de code = 1.95x.

Analyse : Le decoupage en 2 invocations du builder (1 par phase du plan) a bien fonctionne. Chaque invocation a produit du code fonctionnel avec tests. Le builder a suivi les interfaces definies par l'architect sans deviation. Temps effectif de codage : 7 min pour 958 lignes — tres rapide grace aux interfaces pre-definies.


Step 8 — Audit + corrections | 18h55-19h03

Skill/Agent reviewer (x2), guardian (x2), fixer (x1)
Modele reviewer/guardian: opus, fixer: sonnet
Action Audit qualite 5 axes + securite OWASP, corrections, re-audit
Outils Read (fichiers source + tests), Edit, Bash (pytest, pip-audit)
Livrable 5 findings corriges, score 81 → 97
Duree agents Round 1: ~2.5 min (parallele) + fixer: ~3 min + Round 2: ~1.5 min (parallele)

Round 1 — Audit initial (reviewer + guardian en parallele) :

Reviewer (81/100) — 7 findings :

ID Severite Fichier Probleme
FINDING-001 major (-10) client.py:62 raise_for_status() manquant dans get_latest_release
FINDING-002 minor (-3) cli.py:42-49 return au lieu de sys.exit(1) sur erreurs
FINDING-003 minor (-3) client.py:17 Session jamais fermee
FINDING-004 minor (-3) client.py:17 Pas de timeout (except Timeout = code mort)
FINDING-005 minor pyproject.toml:7 Version 0.0.0 vs v1.0.0
FINDING-006 minor test_cli.py:55 Test duplique sans assertion message
FINDING-007 minor test_cli.py:101 Test masquage ne teste pas le mecanisme reel

Guardian (91/100) — 3 findings :

ID Severite Categorie Probleme
SEC-001 minor (-3) OWASP-A02 HTTP en clair (reseau local)
SEC-002 minor (-3) OWASP-A07 Timeout manquant
SEC-003 minor (-3) OWASP-A07 raise_for_status manquant

Convergence findings : SEC-002 = FINDING-004, SEC-003 = FINDING-001. Les 2 agents ont trouve les memes problemes independamment.

Fixer — 5 corrections appliquees :

Finding Correction
FINDING-001/SEC-003 resp.raise_for_status() ajoute + test server error
FINDING-004/SEC-002 timeout: int = 30 dans constructeur + propagation + 2 tests
FINDING-002 sys.exit(1) dans les 3 blocs except
FINDING-006 Test duplique supprime, assertion message ajoutee
FINDING-007 Test renforce avec exception contenant la valeur sensible

Non corriges (acceptes) : FINDING-003 (session.close — negligeable pour CLI), FINDING-005 (version — bump au step 10), SEC-001 (HTTP local — reseau prive).

Round 2 — Re-audit (reviewer + guardian en parallele) :

  • Reviewer : 100/100, 0 findings, APPROVED
  • Guardian : 97/100, 1 finding minor (boucle pagination sans borne max — contextuel), APPROVED
  • Score de reference : min(100, 97) = 97/100
  • Delta potentiel round 3 : <= 0 → boucle adversariale terminee

Analyse : L'audit adversarial est la phase la plus productive du workflow en termes de qualite. Le finding major (raise_for_status) aurait cause des erreurs silencieuses en production. Le timeout manquant rendait le catch Timeout inutile. La parallelisation reviewer/guardian est efficace (meme temps que 1 seul agent). Le fixer (sonnet) a corrige 5 findings en 3 min sans erreur.


Phase 3 — PRE-RELEASE (steps 9-10)

Step 9 — Smoke test | 19h03-19h08

Skill/Agent Orchestrateur principal (test CLI reel)
Modele opus
Action Execution du CLI contre l'instance Gitea reelle
Outils Bash (python3 -m gitea_dashboard), AskUserQuestion, Write (main.py), mcp__gitea__milestone_read, mcp__gitea__milestone_write (delete)
Livrable Dashboard affiche avec 13 repos reels

Deroulement :

  1. Variable d'environnement GITEA_TOKEN non definie → demande a l'utilisateur
  2. Premier essai : 401 Unauthorized (valeur invalide)
  3. Test curl : confirme que la valeur est invalide
  4. Deuxieme essai : erreur No module named gitea_dashboard.__main__
  5. Bug decouvert : __main__.py manquant → creation du fichier
  6. Re-execution : succes, 13 repos affiches
  7. Bug donnees : milestone v1.0.0 dupliquee (id 29 vide + id 30 avec issues) → suppression id 29
  8. Re-execution : dashboard propre

Checklist validee :

  • 13 repos affiches
  • Issues comptees correctement (iot: 28, gitea-dashboard: 4)
  • Releases avec dates relatives, "—" si aucune
  • Milestones avec progression
  • Erreurs gerees

Analyse : Le smoke test a decouvert 2 vrais problemes : (1) __main__.py manquant — le builder ne l'a pas cree car ce n'etait pas dans les interfaces du plan, et (2) la milestone dupliquee creee par l'architect. Sans smoke test, la v1.0.0 aurait ete inutilisable via python -m. C'est l'etape qui justifie le plus son existence dans le workflow.


Step 10 — Documentation | 19h08-19h29

Skill/Agent documenter
Modele sonnet
Action Mise a jour README.md complet + creation CHANGELOG.md + version bump
Outils Read, Write, Edit
Livrable README.md (72 lignes), CHANGELOG.md (19 lignes), pyproject.toml (version 1.0.0)
Duree agent ~1.6 min (95s)

README.md : description, prerequis, installation, configuration (variables d'env avec tableau), usage, exemple de sortie, section developpement.

CHANGELOG.md : format Keep a Changelog, 7 entrees "Added" pour v1.0.0.

Incident : Le hook secret-scanner a necessite une reformulation de la section configuration (eviter d'ecrire une valeur d'exemple pour la variable sensible).

Analyse : 21 min pour la documentation semble long, mais c'est principalement du temps d'attente MCP/hooks. Le documenter (sonnet) a produit le contenu en 95s.


Phase 4 — PUBLICATION (steps 11-12)

Step 11 — Release | 19h29-19h31

Skill/Agent Orchestrateur principal
Modele opus
Action Push, tag git, release Gitea
Outils Bash (git push, git tag, git push tag), mcp__gitea__create_release
Livrable Tag v1.0.0, release Gitea avec notes

Sequence :

  1. git push origin main (18 commits)
  2. git tag -a v1.0.0 + git push origin v1.0.0
  3. mcp__gitea__create_release avec body detaille (Added + Details)

Analyse : Etape rapide et sans friction. L'integration MCP pour la release Gitea evite de passer par l'interface web.


Step 12 — Deploy | skipped

Raison : outil CLI local, pas de deploiement serveur.


Phase 5 — POST-RELEASE (step 13)

Step 13 — Retrospective | 19h31

Skill/Agent Orchestrateur principal
Modele opus
Action Collecte metriques, analyse, MEMORY.md, fermeture milestone
Outils Bash (find, wc, pytest, git log), Write (analyse + MEMORY.md), mcp__gitea__milestone_write (close), Edit (workflow-progress.md)
Livrable docs/analyse/gitea-dashboard-v1.0.0-2026-03-10.md, MEMORY.md

Analyse : La retrospective est principalement un travail de synthese. La fermeture automatique du milestone Gitea via MCP est un bon point d'integration.


3. Agents utilises

Tableau recapitulatif

Agent Modele Invocations Role Duree totale Read-only
researcher opus 1 Investigation API Gitea ~4.5 min oui
architect opus 1 Plan v1.0.0, architecture, ADR ~3.2 min non
builder opus 2 Implementation phase 1 + phase 2 ~7 min non
reviewer opus 2 Audit qualite round 1 + 2 ~2 min oui
guardian opus 2 Audit securite round 1 + 2 ~2.5 min oui
fixer sonnet 1 Corrections findings ~3 min non
documenter sonnet 1 README + CHANGELOG ~1.6 min non
scout sonnet 1 Exploration pour cette analyse ~1.3 min oui

Total : 11 invocations d'agents, ~25 min de temps agent cumule.

Agents non utilises

Agent Raison
orchestrator < 6 fichiers, pas necessaire
tester Smoke test fait manuellement par l'orchestrateur principal

Repartition par modele

Modele Agents Invocations Usage
opus researcher, architect, builder, reviewer, guardian 8 Taches complexes (recherche, planification, implementation, audit)
sonnet fixer, documenter, scout 3 Taches plus simples (corrections, docs, exploration)
haiku 0 Jamais utilise (interdit par les regles)

4. Outils MCP et integrations

Outils Gitea MCP

Outil Appels Etape Usage
mcp__gitea__milestone_write (create) 1 (+1 par architect) 5 Creation milestone v1.0.0
mcp__gitea__milestone_write (delete) 1 9 Suppression milestone dupliquee
mcp__gitea__milestone_write (edit) 1 13 Fermeture milestone
mcp__gitea__milestone_read (list) 1 9 Verification doublons
mcp__gitea__issue_write (create) 4 5 Creation issues #1-#4
mcp__gitea__issue_write (add_labels) 4 5 Ajout labels aux issues
mcp__gitea__label_write (create) 4 5 Creation labels
mcp__gitea__label_read (list) 1 5 Verification labels existants
mcp__gitea__create_release 1 11 Creation release v1.0.0
mcp__gitea__get_me 1 9 Verification connectivite
Total 19 appels MCP

Outils Claude Code

Outil Usage principal
Read Lecture fichiers (templates, code, config) — utilise massivement
Write Creation de nouveaux fichiers (docs, source, tests)
Edit Modifications ciblees (workflow-progress.md surtout)
Bash Git operations, pytest, pip, curl, find/wc
Glob Recherche de fichiers par pattern
AskUserQuestion 3 questions posees (filtre repos, smoke test mode, valeur sensible)
Agent 11 invocations (voir section 3)
Skill 2 invocations (/workflow, /forge)
ToolSearch Chargement dynamique des outils MCP et AskUserQuestion

Hooks actifs

Hook Declenchements Effet
secret-scanner 2 Blocage ecriture README (faux positif), reformulation necessaire
UserPromptSubmit Chaque message Validation OK

5. Metriques finales

Code

Metrique Valeur
Fichiers source Python 6 (5 modules + main.py)
Fichiers tests Python 5 (4 test_*.py + init.py)
Lignes code source 325
Lignes tests 633
Ratio tests/code 1.95x
Tests 37
Couverture Non mesuree

Workflow

Metrique Valeur
Commits 20
Etapes effectuees 12/13
Etapes skippees 1 (deploy)
Agents invoques 11
Appels MCP Gitea 19
Questions posees a l'utilisateur 3
Incidents/bugs 3 (milestone doublon, main.py, valeur invalide)

Audit

Metrique Round 1 Round 2
Reviewer 81/100 100/100
Guardian 91/100 97/100
Findings totaux 10 (1 major, 9 minor) 1 (minor contextuel)
Findings corriges 5
Findings acceptes 3 1
Findings differes 1 (version pyproject)

6. Analyse critique

Forces du workflow

1. Pipeline structure et tracable Chaque etape produit un livrable identifie, commite, et logue dans workflow-progress.md. La tracabilite est excellente : on peut suivre chaque decision, chaque agent, chaque commit.

2. Audit adversarial efficace Le round 1 a trouve un vrai bug major (raise_for_status manquant) et un code mort (timeout). Le mecanisme reviewer + guardian en parallele puis fixer est productif. La convergence des findings entre les 2 agents valide la pertinence.

3. Smoke test revelateur A decouvert 2 bugs que ni le builder ni l'audit n'avaient trouves : main.py manquant et milestone dupliquee. Justifie pleinement son existence.

4. Integration Gitea MCP fluide Issues, milestones, labels, releases — tout cree depuis le workflow sans quitter le terminal. 19 appels MCP sans erreur technique.

5. Separation des responsabilites agents Chaque agent a un perimetre clair. Le builder n'a pas eu a decider de l'architecture (c'est l'architect), le fixer n'a pas eu a trouver les bugs (c'est le reviewer/guardian).

Faiblesses du workflow

1. Ceremonie excessive pour un petit projet 13 etapes pour 325 lignes de code. Les steps 1-3 (framing) produisent 7 fichiers de documentation pour un projet dont le besoin tenait en 3 phrases. Le ratio documentation/code est disproportionne.

2. Duplication reviewer/guardian Les 2 agents ont trouve les memes findings (raise_for_status, timeout). Pas de deduplication avant le fixer. 2 rapports a lire et comparer manuellement.

3. L'architect cree des doublons La milestone v1.0.0 a ete creee 2 fois (orchestrateur au step 5 + architect au step 6). Pas de verification d'existence avant creation.

4. main.py oublie Ni le plan de l'architect ni le builder n'ont prevu __main__.py. Le plan definissait un entry point dans pyproject.toml mais pas le support de python -m. Decouvert au smoke test.

5. Pas de couverture de code 37 tests mais aucune mesure de couverture. pytest-cov absent des deps dev. Impossible de savoir si les tests couvrent tout le code.

6. URL par defaut incorrecte Le code utilise http://192.168.0.106:3000 mais l'instance repond sur https://gitea.tsmse.fr. Le smoke test a necessite un override manuel. Non corrige.

Temps par categorie

Categorie Duree % du total
Framing (steps 1-3) 8 min 10%
Recherche (step 4) 17 min 22%
Planification (steps 5-6) 5 min 6%
Developpement (step 7) 11 min 14%
Audit (step 8) 8 min 10%
Test (step 9) 5 min 6%
Documentation (step 10) 21 min 27%
Release + retro (steps 11-13) 2 min 3%

Observation : la documentation (27%) et la recherche (22%) consomment presque la moitie du temps. Le developpement proprement dit ne represente que 14%.


7. Recommandations

Pour le workflow (generique)

# Recommandation Impact Effort
1 Deduplication findings : fusionner les rapports reviewer/guardian avant le fixer Evite le travail en double Moyen
2 Fusion steps 1-3 pour les projets simples (< 10 fichiers estimes) Reduit la ceremonie Faible
3 Checklist builder : verifier main.py si pyproject.toml a un entry point CLI Evite un bug recurrent Faible
4 Verification existence : avant de creer un milestone/issue Gitea, verifier s'il existe deja Evite les doublons Faible
5 Coverage obligatoire : ajouter pytest-cov au template pyproject.toml des projets Python Metriques manquantes Faible
6 Mode "light" : pour les projets < 500 lignes, proposer un workflow reduit (6-7-8-11-13) Adapte la ceremonie au projet Moyen

Pour ce projet (gitea-dashboard)

# Recommandation Priorite
1 Ajouter pytest-cov et mesurer la couverture Haute
2 Changer l'URL par defaut vers https://gitea.tsmse.fr Moyenne
3 Ajouter une limite max de pages dans la pagination Basse
4 Parallelisation des appels API (ThreadPoolExecutor) pour v1.1 Basse