# Audit 03 - Modelli, routing e binding agenti: contro-analisi e stato

**Documento verificato:** [`20260923_audit_03_agent_model_routing.md`](20260923_audit_03_agent_model_routing.md)
**Baseline Git:** `e449691c61faec35cb182a3b0bba53f74fc720e9`
**Data verifica:** 2026-09-23, codex-cli 0.145.0, claude-code 2.1.280

Questa fase include anche i punti lasciati aperti dall'audit 02: modelli fissi nei profili (fasi 6-7), telemetria delle deleghe e Graphify.

## 1. Affermazioni verificate

| # | Affermazione dell'audit | Esito | Evidenza |
|---|---|---|---|
| 3.1 | Il canonico contiene model ID concreti e campi host-specific | **Confermata** | `recommended_model_profile` con `gpt-5.6-*`, "Claude Haiku 4.5", "Gemini 2.5 Pro" e `copilot_multiplier` in tutti e 7 i ruoli |
| 3.2 | `portable-agents-lib.js` rende obbligatorio un modello concreto | **Confermata** | Validazione su `default_model`, `reasoning_effort` e `copilot_multiplier`; i renderer Codex e Copilot scrivevano `model` |
| 3.3 | Claude e Gemini sono gia' `inherit` | **Confermata** | |
| 3.4 | Riferimenti `gpt-5.4*` nel repo | **Confermata, ridimensionata** | Normativi: 1 esempio nel README e i profili generati. Il resto e' storico (`docs/audit`, `docs/analisi-tecniche`) o fixture analytics, lasciati invariati |
| 4.1 | `ROLE_IDS` duplica il canonico | **Confermata** | Era anche l'inventario usato da `state-manager` |
| 4.2 | `ROLE_PRIORITY`/`PHASE_SIGNALS` omettono `docs_writer` e `ui_ux_engineer` | **Confermata** | `indexOf = -1` nel tie-break |
| 4.3 | Le regex dei prompt omettono gli stessi ruoli | **Confermata** | "delega a ui_ux_engineer" restava `subagentMode=off` |
| 4.4 | `SUBAGENTS.md` ha una lista ruoli manuale senza `ui_ux_engineer` | **Confermata** | |
| 5 | Availability aggregata tra runtime | **Confermata** | `targets.some(...)`: un profilo installato solo in Claude risultava `configured` anche per Codex |
| 6 | Il hook non conosce il runtime | **Confermata, con un dettaglio in piu'** | Copilot riusava lo stesso file hook di Codex, quindi il solo comando non poteva distinguerli |
| 7 | Il routing e' un hint, non un binding | **Confermata** | Da `SUBAGENTS.md`: la policy non invoca `spawn_agent` |
| 8 | Graphify usa `agent_type="worker"` | **Confermata, con correzione** | Il worker deve **scrivere** file di chunk (la skill avvisa se l'agente era read-only), quindi `scout` non e' un sostituto valido. Graphify e' vendorizzato e CI-owned: gestito come eccezione registrata e motivata, prevista dal §42.8 |
| 26.3/26.4 | Copilot e Codex funzionano senza `model` | **Verificata** | Copilot: `model` opzionale (documentazione GitHub). Codex 0.145: il file di ruolo richiede solo `name` non vuoto e `developer_instructions` (messaggi di validazione nel binario); il modello arriva dal parent o da `[agents] default_subagent_model` |

## 2. Finding nuovi

- **N1 - I profili agenti installati nella home sono ancora quelli vecchi, con i modelli dell'incidente.** Il nuovo check di deriva mostra 28 profili non allineati. In Codex: `gpt-5.4` (code_reviewer, implementer), `gpt-5.4-mini` (test_writer), `gpt-5.5` (technical_analyst); in Copilot: "Gemini 2.5 Pro" e "Claude Haiku 4.5". Sono esattamente i modelli rifiutati da Codex nei rollout (`Unknown model gpt-5.4-mini / gpt-5.5`). La causa degli spawn falliti e' quindi tuttora presente sulla macchina finche' l'installer non viene rilanciato.
- **N2 - La fonte principale di agenti generici e' l'host, non le skill.** Dai rollout (audit 02): `agent_type` `explorer` 142, `worker` 45, `default` 14. Nel repo l'unico `agent_type` non canonico normativo e' Graphify. La correzione e' quindi l'istruzione di binding esatto nel hook e in `SUBAGENTS.md`, piu' la misura planned vs actual, non una bonifica delle skill.
- **N3 - Un fork full-history clona il parent** (audit 02, N1): e' un secondo meccanismo per cui "il subagente eseguito non e' quello scelto". Ora e' vietato anche nel playbook impeccable-critique, dove una frase lo ammetteva.

## 3. Implementazione

| Fase audit | Stato | Note |
|---|---|---|
| PR1 - Schema canonico v2 | **Fatto** | Per ogni ruolo: `aliases` (`scout` <- `explorer`), `routing_priority` (unica, 1-100), `routing_intents`, `execution_policy` (`model_policy: inherit`, `reasoning_policy`, `context_policy: bounded`, `fallback_policy: main-agent`). `recommended_model_profile` e `copilot_multiplier` rimossi; lo schema v1 e' ancora parsato con un warning di migrazione e mai renderizzato. `ROLE_IDS` e' derivato dal canonico |
| PR2 - Profili model-agnostic | **Fatto** | Codex e Copilot senza `model`/`model_reasoning_effort`; Claude e Gemini `model: inherit`. Un override voluto va nella config locale del runtime (Codex `[agents] default_subagent_model`), mai nel ruolo. Non e' stato introdotto un secondo file di override Sophia: la chiave nativa di Codex copre il caso, e un file aggiuntivo sarebbe un'altra fonte da mantenere |
| PR3 - Availability per runtime | **Fatto** | `agent-availability.json` v2 con `runtimes` (Cursor `unsupported`) e il campo aggregato legacy. Reader: v2 con runtime usa solo quel runtime; runtime ignoto non dice mai `configured`; v1 con runtime vale `unknown`. `--runtime` propagato da tutti i generatori: Codex, Claude, Cursor (comando interno), Antigravity (adapter) e Copilot, ora con un proprio `copilot-hooks.generated.json` (fallback al file Codex per checkout vecchi) |
| PR4 - Routing dal catalogo | **Fatto** | Rimossi `ROLE_PRIORITY`, `PHASE_SIGNALS` e le regex di ruolo. Il vocabolario (`scripts/hooks/agent-vocabulary.mjs`) deriva id, alias e intenti dal canonico. Tutti i 7 ruoli e l'alias sono riconosciuti, anche con spazi ("ui ux engineer", "docs writer"); i riferimenti a file o profili ("use the scout profile", "scout.md") restano esclusi. Ruolo di default = ruolo `discovery` del catalogo, non un id cablato |
| PR5 - Spawn contract | **Fatto** | `scripts/runtime/agent-contract-audit.js` unisce l'audit dei contratti di spawn e dei model binding (§29/§46.1-2): classifica per area, con errori, warning ed eccezioni motivate; segnala le eccezioni non piu' usate. Exact lock: un ruolo esplicito non eseguibile produce `explicit-agent-unavailable` / `explicit-agent-runtime-unsupported`, mai un sostituto. Persona: impeccable-critique/layout/typeset usano il ruolo canonico `code_reviewer`, con la persona nel pacchetto di delega. `SUBAGENTS.md` non elenca piu' i ruoli a mano: rimanda al catalogo, con regole di binding esatto, persona overlay e nickname |
| PR6 - Planned vs actual | **Fatto** (correlazione per sessione) | `executionPlan` unico nel resolver (runtime, ruolo, fonte della selezione, availability, binding, policy modello/contesto, reason code). Il hook emette `AgentDelegationPlanned` con `session_ref` hashato; analytics-node lo importa con metadata filtrati (enum, id sicuri, hash). `subagent-usage-audit.js` riconcilia con gli spawn osservati: `exact`, `different_custom_role`, `generic_fallback`, `not_observed`, `unmatched_session` |
| Audit 02 fasi 6-7 | **Chiuse qui** | Modelli non piu' nei ruoli; `check-user-runtime` segnala i profili installati non allineati e i modelli forzati (N1) |
| §31 - lifecycle Codex nell'adapter analytics | **Non fatto** | La riconciliazione usa i rollout (fonte primaria) tramite il parser; arricchire l'adapter Codex di analytics-node rientra nell'audit 05 |

## 4. Limiti residui

- **L'esecuzione resta mediata dall'host.** La selezione e' deterministica; il binding esatto e' un'istruzione piu' una misura, non un dispatch forzato (§22).
- **La correlazione planned vs actual e' per sessione, non per turno**, e richiede che il payload del hook contenga `session_id`. Se il client non lo invia, l'evento esiste ma risulta `unmatched_session`.
- **Nessun modello nei ruoli.** Un ruolo che prima era `high` (technical_analyst, ui_ux_engineer) ora eredita il reasoning del parent o quello configurato in `[agents] default_subagent_reasoning_effort`.
- **Cataloghi generati prima dell'aggiornamento restano caricabili** (campi v2 opzionali nello schema), ma senza alias e intenti finche' l'installer non li rigenera.
- **`runtime_permissions.codex_sandbox_mode`** resta nel canonico come rappresentazione dei permessi: lo sposta l'audit 04 (permessi generici).
