---
suivi: 1044
date: 2026-07-29
sujet: Aktor — note de consolidation du backlog (agent CLI + écran)
chantier: aktor
type: feature
statut: poussé
hash: 16b63609
fichiers:
  - database/migrations/2026_07_29_120000_create_assistant_consolidations_table.php
  - app/Models/AssistantConsolidation.php
  - app/Support/AktorZonesCommunes.php
  - app/Services/Assistant/AssistantConsolidationTools.php
  - app/Services/Assistant/AssistantConsolidationAgentService.php
  - app/Console/Commands/AktorConsoliderCommand.php
  - app/Http/Controllers/AssistantConsolidationController.php
  - config/assistant.php
  - database/seeders/SettingsSeeder.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - routes/web.php
  - resources/js/Pages/Aktor/Consolidations.vue
  - resources/js/Pages/Aktor/ConsolidationShow.vue
  - resources/js/Pages/Admin/Index.vue
  - tests/Unit/AssistantConsolidation1044Test.php
  - public/build/
  - docs/suivi/SUIVI_1044_aktor_consolidation_backlog.md
---

## PROMPT ENVOYÉ

SUIVI #1044 — note de consolidation Aktor (agent CLI tool_use, lecture seule,
aveugle au code, verdicts REGROUPABLE/EN SÉRIE/INDÉPENDANT, écran GS_DSI+GS_ADMIN_ERP,
table versionnée assistant_consolidations). HEAD base b3abefec.

## SYNTHÈSE

### Pré-requis
`origin/main` = `b3abefec` (#1043). Rebuild rebase sur ce HEAD.

### Architecture
- Commande `php artisan aktor:consolider [--user=ID] [--dry-run] [--max-tours=N]`
- Boucle Anthropic tool_use, plafond setting `claude.consolidation_max_tours` (défaut 6)
- Quota journalier 25 messages réutilisé (1 message user / tour)
- Table `assistant_consolidations` versionnée (chaque run = nouvelle ligne)
- Front `/aktor/consolidations` + détail ; carte Admin ; pas de déclenchement web
- Visibilité couche 1 : middleware `m365.groups:GS_DSI,GS_ADMIN_ERP` + assert controller

### Outils (liste fermée, lecture seule)
1. `lister_taches_ouvertes()` — créateur OU associé, ouvertes, borne 40
2. `lire_tache(tache_id)` — détail + fiche cadrage si présente
3. `chercher_historique(requete)` — journal visible + frontmatters docs/suivi (suivi/sujet/chantier/type/statut/fichiers)

### Critère d'arrêt
Toutes tâches examinées OU plafond tours OU budget contexte (`claude.cadrage_contexte_max_chars`).
Plafond / budget → note PARTIELLE + IDs non traités listés. Pas de note vide persistée.
Échec LLM / quota / périmètre vide → exit FAILURE, Log::error + trace, message clair.

### Bundles
`Consolidations-D_6Fa72W.js`, `ConsolidationShow-BrSs79Fl.js`, `public/build/` commité.

### Tests
7 unit tests passent (outils, prompt, DI, zones, versionnement). Preuve métier = prod.

## DÉPLOIEMENT / TEST

```bash
git pull origin main
find app/ -name "*.php" -exec touch {} +
php artisan migrate --force
php artisan optimize:clear
php artisan view:clear
php artisan route:clear
php artisan journal:sync
php artisan aktor:consolider --user=<ID_ROBIN> --dry-run
php artisan aktor:consolider --user=<ID_ROBIN>
```

Ouvrir `/aktor/consolidations` (GS_DSI / GS_ADMIN_ERP).

## LEÇON

Aktor reste aveugle au code : l'autonomie sur « traitable ensemble » vient de sources
factuelles (frontmatters `fichiers:` + zones communes), pas d'invention. Un catch qui
renvoie une note vide serait pire qu'un échec visible — même leçon que #1043.

Sur OVH mutualisé cluster113, le HTTPS sortant est BLOQUÉ en CLI. Tout appel API externe
(Anthropic, Sage Intacct, Meta Graph, Microsoft Graph) doit partir du contexte web / PHP-FPM.
L'ERP ne peut pas non plus s'appeler en loopback. Conséquence : aucune fonctionnalité
dépendant d'une API externe ne peut être portée par une commande artisan ou un cron CLI.
(Correctif point d'entrée : #1046.)
