Problème — le retry aveugle

Avant v7.3.0, maxRetries: 2relançait la même phase avec le même contexte. Résultat : relancer le dé, pas corriger. L'humain devait lire l'erreur, la rephraser et re-prompter manuellement.

Avant — cycle manuel
Generate
FAIL
Human reads error
Human reprompts
Generate
Après — loop autonome
Generate
Execute/Test
Parse error
Inject context
Generate
↑____________ (max 3 iter)

Fonctionnement

1

Capture de l'erreur

L'orchestrateur passe le fichier d'erreur brut (stderr de l'agent) au flag --error-output.

node run.js fail $RUN_ID coverage "tests KO" \
  --error-output /tmp/coverage-stderr.txt
2

Parsing structuré

error-context.jsparse les 4 types d'erreurs supportés.

// TypeScript
src/auth/auth.service.ts(47,15): error TS2339:
Property 'userId' does not exist on type 'JwtPayload'.

// Node:test TAP
not ok 1 - should return 401 if token invalid

// Runtime
TypeError: Cannot read properties of undefined (reading 'id')
    at AuthService.validateUser (src/auth/auth.service.ts:89:20)

// Lint (ESLint)
src/app.module.ts
  12:1  error  'Injectable' is defined but never used
3

Injection dans le re-prompt

Le bloc formaté est préfixé au prompt de l'agent lors du loop-back.

[AI ENGINEERING LOOP — Iteration 2/3]
Previous attempt failed with 2 error(s).
Fix ONLY what is listed below.

[ERROR 1] typescript — src/auth/auth.service.ts:47
Property 'userId' does not exist on type 'JwtPayload'.

[ERROR 2] test — (no file)
should return 401 if token invalid

Do not rewrite unrelated code. Apply minimal targeted fixes only.
4

Loop-back et garde

La phase cible (backend) est remise en pending avec le contexte injecté. Après maxLoops itérations sans succès, escalade humaine automatique.

# Après 3 échecs → escalade
[LOOP LIMIT REACHED] coverage → backend :
3 iterations max atteintes — intervention manuelle requise

Configuration pipeline

// pipelines.json — phase coverage
{
  "id": "coverage",
  "agent": "tester",
  "stopOnFailure": false,
  "loopTo": "backend",      // phase cible du loop-back
  "maxLoops": 3,            // guard — escalade humaine après N itérations
  "loopCondition": "test_failures"
}

Sortie next --json enrichie

node run.js next $RUN_ID --json
# {
#   "ready": [{
#     "phaseId": "backend",
#     "agent": "nestjs",
#     "model": "claude-opus-4-8",
#     "isLoopRetry": true,
#     "loopContext": "[AI ENGINEERING LOOP — Iteration 2/3]..."
#   }]
# }

Erreurs non-déterministes

Les erreurs réseau et mémoire (ECONNREFUSED, ETIMEDOUT, OOM) sont détectées automatiquement. Elles ne déclenchent pas de loop — le pipeline échoue immédiatement pour escalade humaine. Un re-prompt ne peut pas corriger une base de données inaccessible.

Impact mesuré

SWE-bench (Princeton, 2024) et Reflexion (Shinn et al., 2023) montrent +30–40% de taux de résolution avec une boucle observe → reason → act vs single-pass. L'implémentation ADA cible le même gain sur les phases backend/coverage du pipeline feature.