- CLAUDE.md: TZ, SSO, vault-steward, versioning, persona v2.0, multitenant, KB RAG - docs/standards: persona-conversational-rules v2.0 - docs/STANDARD_*: installer-integration, email-relay, AI-prodotto, marketing-tenant, multitenant - AGENT_CHANGES.md + OPEN_TICKETS.md (registri agent automatico) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1433 lines
78 KiB
Markdown
1433 lines
78 KiB
Markdown
# STANDARD AgileHub — Persona Digitale (Conversational Rules + Modello Umano)
|
||
|
||
> **Autorità**: AgileHub (single source of truth per la suite Agile Software).
|
||
> **Versione**: 2.0-DRAFT — 2026-05-09
|
||
> **Stato**: DRAFT — in review utente. Promuovere ad ADOPTED dopo validazione.
|
||
> **Destinatari**:
|
||
> - **Agile AI** — governance regole conversazionali + KB
|
||
> - **VOX** — implementazione TTS/voice constraints + Avatar Registry runtime
|
||
> - **PRISMA** — UI Editor Avanzato persona (frontend)
|
||
> - **REGENT** — coordinamento cross-agente del rollout
|
||
> - **VIGILE** — audit etico + GDPR compliance + accountability
|
||
> - **TITAN** — refactor chirurgico Scope B (controller + schema DB)
|
||
> - **MAESTRO** — orchestrazione AWE workflow con persona digitali (Phase G.B Actor Model)
|
||
> - **CICERONE** — applicazione persona digitali alla pipeline lead engagement
|
||
> - **MARKETER** — eventuale uso persona digitali in marketing module
|
||
> Tutti i team che configurano persone digitali.
|
||
>
|
||
> **Owner primario**: Agile AI (governance regole + Persona Knowledge Base).
|
||
> **Co-owner**: VOX (TTS/voice runtime), PRISMA (UI Editor), VIGILE (codice etico + audit GDPR).
|
||
>
|
||
> **Registry DB target**: `nexus_hub.hub_standards` (slug=`persona-conversational-rules`, version=`2.0`). Questo file è una **bozza** che diventa la copia derivata canonica dopo INSERT.
|
||
> **Applies_to**: `*` (tutta la suite Agile Software). Le persone digitali sono asset cross-suite (vedi Sez. 16 integrazione cross-standard).
|
||
> **Branch**: `feature/phase-g-replica-actor` (lavorazione attiva, non merged).
|
||
|
||
---
|
||
|
||
## Changelog
|
||
|
||
### v2.0-DRAFT — 2026-05-09 (refactor strategico)
|
||
**Trigger**: richiesta utente "miglioralo e integralo al modello Agile che parte considerando le persone digitali come persone umane esatto parallelismo".
|
||
**Cambiamenti rispetto a v1.0**:
|
||
- Aggiunta **Sezione 0** "Modello AgileHub: Persona Digitale = Persona Umana" — framework concettuale unificante che mappa 1:1 ogni elemento di identità professionale umana al corrispettivo digitale (CV → skills DB, voce → ElevenLabs voice_id, volto → Tavus replica, conoscenza → KB+RAG, esperienza accumulata → conversation_stream, codice etico → constraint).
|
||
- Schema dichiarativo **esteso da 7 → 14 categorie** con 7 nuove (3.8-3.14):
|
||
- 3.8 `code_of_conduct` — codice etico AI persona-specifico (transparency, no deception, GDPR compliance)
|
||
- 3.9 `emotional_intelligence` — tono, archetipo, empathy, communication style
|
||
- 3.10 `conversation_memory` — cosa ricorda + scope persistence + GDPR Art.17 erasure
|
||
- 3.11 `escalation_policy` — when/how passare a operatore umano
|
||
- 3.12 `performance_metrics` — KPI qualità conversazione (CSAT, resolution rate, escalation rate)
|
||
- 3.13 `lifecycle_stage` — stage corrente (training/onboarding/operativa/review/dismissed)
|
||
- 3.14 `demo_sequence` — sequenze guidate multi-topic auto-advance (es. presentazione documento)
|
||
- Nuova **Sezione 16** "Integrazione cross-standard AgileHub" — mappa esplicita ai 7 sistemi esistenti (Phase E Persona Composer, Avatar Registry G.A, Phase G.B Actor Model, RAG Platform, AWE Workflow Engine, KB Sync Worker, Vault Steward) + cross-reference a `hub_standards` slug correlati.
|
||
- Nuova **Sezione 17** "Lifecycle persona digitale HR-grade" — 6 fasi parallele al ciclo dipendente umano (assunzione, onboarding, operatività, growth, performance review, dismissione graceful).
|
||
- Nuova **Sezione 18** "Codice Etico AI persone digitali AgileHub" — 9 principi vincolanti applicabili a TUTTE le persone (identity transparency, GDPR Art.13/22, no deception, scope refusal, escalation, audit log, sub-processor disclosure).
|
||
- Nuova **Sezione 19** "Persona Knowledge Base (PKB) layered" — 4 livelli L0/L1/L2/L3 (System global, Tenant, Company, Persona-specific) con governance trust_level + retention.
|
||
- Adoption tracker (Sez. 14) **esteso** con incorporazione 9 ottimizzazioni Aria 2026-05-09 (DEMO_SEQUENCE, ABBREV_MAP, IDENTITY_DRIFT_RE, REPAIR_RE, FOLLOWUP_RE, prefill assistant URL, end-topic/next-topic markers, no-flash safety, topic-switch close-card).
|
||
- Riferimenti (Sez. 13) ampliati a tutti gli standard `hub_standards` correlati e ai 9 agenti specialisti AgileHub.
|
||
|
||
### v1.0-DRAFT — 2026-05-08
|
||
- Versione iniziale di design.
|
||
- Trigger: lavoro chirurgico su persona ARIA_SUPPORTO_RANOCCHI (~30 fix in un giorno) ha esposto che le regole conversazionali (TTS pronuncia, naming prodotto, image handling, scope, latency, format) sono stratificate in 4 strati di cui 1 hardcoded (`reminderBlock` JS in `dimostrazioneTavusLlmController.js`). Pattern non riusabile per le altre 22 persone digitali della suite (5 ARIA, 7 GIULIA, 1 AGILE_RUNTIME, ecc).
|
||
- Obiettivo: spostare TUTTE le regole conversazionali in tabella DB `agent_constraints` con schema dichiarativo a 7 categorie. Refactor del controller per assemblare il system_prompt runtime dal DB invece che da costanti JS.
|
||
|
||
---
|
||
|
||
## 0. Modello AgileHub: Persona Digitale = Persona Umana
|
||
|
||
### 0.1 Filosofia fondante
|
||
|
||
Le persone digitali della suite Agile Software **NON sono "AI assistants" generici**. Sono **identità professionali a tutti gli effetti**, con lo stesso parallelismo di una persona umana assunta dall'azienda: hanno un CV, un volto, una voce, competenze certificate, vincoli professionali, etica del lavoro, esperienza accumulata e — quando il loro mandato finisce — una dismissione graceful.
|
||
|
||
Questo standard nasce dalla constatazione che governare 22+ persone digitali con lo stesso rigore con cui si governa il personale umano è l'unico modo per garantire qualità, accountability e conformità GDPR su scala. Una persona digitale "improvvisata" (fatta solo di system_prompt hardcoded) è l'equivalente di assumere senza colloquio, formare senza onboarding, lasciar lavorare senza supervisione.
|
||
|
||
### 0.2 Parallelismo esatto — tabella di mappatura
|
||
|
||
| Aspetto persona umana | Implementazione digitale AgileHub | Tabella/Sistema | Owner |
|
||
|---|---|---|---|
|
||
| **Nome e cognome** | `agent_key` (slug univoco) + `display_name` + `name` | `nexus_ai_db.ai_agent_profiles` | Agile AI |
|
||
| **CV / curriculum** | `digital_persona_skills` (skill_definition_id + level 1-5 + provenance + audit) | `nexus_ai_db.digital_persona_skills` | Agile AI (Phase E) |
|
||
| **Foto identificativa** | Avatar registry: `replica_id` (Tavus digital twin) o `avatar_image_url` static | `nexus_presenter_db.ai_profiles` (esteso Phase G.A) | VOX |
|
||
| **Voce reale** | `voice_id` ElevenLabs (clonata o stock) + `pronunciation_dictionary_id` | `agent_resource_bindings` resource_kind=voice | VOX |
|
||
| **Specializzazione professionale** | `vertical` + `role` + `characteristics.specialization` (Phase E) | `ai_agent_profiles` esteso | Agile AI |
|
||
| **Personalità / stile relazionale** | `characteristics.tone` + `persona_archetype` + `communication_style` (Phase E) | `ai_agent_profiles.characteristics` JSON | Agile AI |
|
||
| **Conoscenza professionale** | KB articles (visibility=global/tenant/team/private) + RAG repository bindings (Phase D Knowledge Platform) | `nexus_rag_db.rag_repositories` + `rag_entity_bindings` | Agile AI + VOX (RAG runtime) |
|
||
| **Esperienza accumulata sul lavoro** | Conversation history auto-ingest in RAG repo dedicato `conversation_stream_t{tenant}` (ConversationStreamWorker, Phase D LIVE) | `rag_repositories` repo_type=`conversation_stream` | Agile AI |
|
||
| **Memoria a breve termine** | `ai_sessions` per turno corrente + `_loadMemoryForSession()` lookup heuristic 30min | `nexus_ai_db.ai_sessions` | Agile AI |
|
||
| **Codice etico professionale** | `code_of_conduct` constraint (Sez. 3.8) + Sezione 18 codice etico AgileHub | `agent_constraints` constraint_key=code_of_conduct | VIGILE + Agile AI |
|
||
| **Vincoli operativi (out-of-scope, escalation)** | `topic_scope` constraint (3.3) + `escalation_policy` (3.11) | `agent_constraints` | Agile AI |
|
||
| **Modalità di parlare (lingua, tono, sigle)** | `tts_pronunciation` (3.2) + `emotional_intelligence` (3.9) + `format` (3.7) | `agent_constraints` | VOX + Agile AI |
|
||
| **Capacità di "ricordare"/"dimenticare"** | `conversation_memory` constraint (3.10) — scope persistence + GDPR Art.17 erasure | `agent_constraints` + `rag_erasure_log` | Agile AI + VIGILE |
|
||
| **Procedura di onboarding** | Persona Composer wizard 6 step (`/admin/personas/new`) — Phase E LIVE | UI nexus-dashboard | Agile AI + PRISMA |
|
||
| **Performance review periodica** | `performance_metrics` constraint (3.12) — CSAT, resolution rate, drift detection | KPI dashboard `/admin/personas/[key]/metrics` (futuro) | VIGILE + Agile AI |
|
||
| **Stage di carriera** | `lifecycle_stage` constraint (3.13) — training/onboarding/operativa/review/dismissed | `agent_constraints` | Agile AI |
|
||
| **Diritto al lavoro / autorizzazione operativa** | `ai_agent_profiles.active=true` + (futuro) GDPR consent doppio se replica avatar (Phase G.A) | + `replica_consent_log` (Phase G.A pending) | VIGILE + INSTALLATORE |
|
||
| **Dimissioni / pensionamento** | Procedura dismissione graceful (Sez. 17.6): `active=false` + GDPR cascade erasure conversation history + tombstone audit | `ai_agent_profiles` + `rag_erasure_log` | Agile AI + VIGILE |
|
||
|
||
### 0.3 Quattro layer di identità della persona digitale
|
||
|
||
Per ogni persona, l'identità si compone di **4 layer** sovrapposti, ciascuno con il proprio sistema di gestione:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────┐
|
||
│ LAYER 4 — ETICO/GOVERNANCE │
|
||
│ Codice etico AI + audit GDPR + accountability │
|
||
│ → constraint code_of_conduct (3.8) + Sezione 18 │
|
||
│ Owner: VIGILE │
|
||
├─────────────────────────────────────────────────────────────────────┤
|
||
│ LAYER 3 — COMPORTAMENTALE/CONVERSAZIONALE │
|
||
│ Come parla, tono, scope, format, latency, immagini, repair, demo │
|
||
│ → 14 constraint categories (Sez. 3) — questo standard │
|
||
│ Owner: Agile AI + VOX │
|
||
├─────────────────────────────────────────────────────────────────────┤
|
||
│ LAYER 2 — CONOSCITIVO/COMPETENZE │
|
||
│ Skills (digital_persona_skills) + KB articles + RAG bindings │
|
||
│ + conversation history accumulata │
|
||
│ → Phase E Persona Composer + RAG Platform Phase D │
|
||
│ Owner: Agile AI │
|
||
├─────────────────────────────────────────────────────────────────────┤
|
||
│ LAYER 1 — TECNICO/IDENTITARIO │
|
||
│ agent_key, display_name, vertical, role, voice_id, replica_id, │
|
||
│ LLM provider/model, characteristics base │
|
||
│ → ai_agent_profiles + agent_resource_bindings │
|
||
│ Owner: Agile AI + VOX (per voice/avatar) │
|
||
└─────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**Principio chiave**: una persona digitale è "completa e operativa" SOLO quando tutti e 4 i layer sono configurati. Una persona con LAYER 1 ma senza LAYER 3 (= un agent_key con system_prompt vuoto) non è autorizzata a operare in produzione (= equivalente a assumere senza contratto).
|
||
|
||
### 0.4 Composizione cross-stack — 7 sistemi AgileHub coinvolti
|
||
|
||
Una persona digitale "viva" attraversa runtime 7 sistemi distinti:
|
||
|
||
1. **`nexus-ai-ms`** (porta 4211) — runtime LLM passthrough Tavus + RAG retrieval + conversation persist
|
||
2. **`nexus-presenter-ms`** (porta 4216) — Avatar Registry + Tavus session lifecycle + LiveKit (Phase G.A)
|
||
3. **`nexus-rag-ms`** (porta 4225) — RAG Platform Phase B+C+D — embeddings + retrieval semantic + KB Sync Worker
|
||
4. **`nexus-voice-ms`** (porta 4215) — Pipecat pipeline STT/LLM/TTS per voice-only (Charlotte ElevenLabs)
|
||
5. **`nexus-call-ms`** (porta 4219) — Telephony bridge Twilio Media Stream (per persone telefonate)
|
||
6. **`agilehub-workflow-engine`** (porta 4230) — AWE M1+M2 con Phase G.B Actor Model — persona può ESSERE l'attore di uno step workflow (`actor_type=AI_PERSONA_ID`)
|
||
7. **`vault-steward`** — secure storage `voice_id`, `replica_id`, API keys (Anthropic, ElevenLabs, Tavus, LiveKit, Voyage)
|
||
|
||
Ogni sistema ha SLA di lettura della persona < 100ms (cache LRU 5min su `loadPersona(agentKey)` + `loadAllConversationalRules(personaId)`).
|
||
|
||
### 0.5 Come questo standard si lega al modello AgileHub
|
||
|
||
Questo standard `persona-conversational-rules` v2.0 è il **TIER UNIFICATORE** che lega tutti i layer e tutti i sistemi:
|
||
|
||
- Definisce lo schema delle 14 constraint categories che vivono in `agent_constraints` (LAYER 3)
|
||
- Riferisce a `digital_persona_skills` (LAYER 2 — Phase E)
|
||
- Riferisce a `agent_resource_bindings` voice/avatar (LAYER 1 — VOX)
|
||
- Definisce il codice etico (LAYER 4 — VIGILE)
|
||
- Specifica il lifecycle (Sez. 17) che governa l'evoluzione della persona dal Layer 1 → 4
|
||
|
||
Senza questo standard, configurare una persona richiede 7 sistemi disgiunti senza orchestrazione esplicita. Con questo standard, la persona ha un **dossier unificato** governato da una singola fonte (DB) e una singola UI (Persona Composer).
|
||
|
||
---
|
||
|
||
## 1. Scope e applicabilità
|
||
|
||
### 1.1 Cosa copre questo standard
|
||
|
||
Questo documento definisce **lo schema dichiarativo unico** delle regole conversazionali per tutte le persone digitali della suite Agile Software. Le regole vivono in `nexus_ai_db.agent_constraints` come righe `(constraint_key, constraint_value JSON)` editabili da UI Editor Avanzato (`/admin/personas/[key]`) e applicate runtime dal controller AI generico.
|
||
|
||
Vale per:
|
||
- Persone digitali in `ai_agent_profiles` (oggi 22 active: 5 ARIA support per prodotto, 7 GIULIA per FIS Romania, 1 AGILE_RUNTIME META, 1 ARIA_SUPPORTO_RANOCCHI, ecc).
|
||
- Tutte le pipeline di dialogo che usano `nexus-ai-ms` come custom LLM (videochat Tavus, chat testuale dimostrazione, future canali voice-only).
|
||
- Tutti i flussi RAG-augmented che richiedono coerenza di stile (pronuncia TTS, naming prodotto, scope check).
|
||
|
||
### 1.2 Cosa NON copre
|
||
|
||
- Identità di base (nome, ruolo, vertical) → resta in `ai_agent_profiles`.
|
||
- KB inline (release notes, manuali) → resta in `agent_attachments` con `inject_as=system_prompt_append`.
|
||
- Scalette playbook (sequenze step) → resta in `agent_presentation_scripts`.
|
||
- Skills (competenze tecniche) → resta in `digital_persona_skills`.
|
||
- Bindings risorse (voice provider, avatar Tavus, RAG repositories) → resta in `agent_resource_bindings`.
|
||
|
||
Questo standard si occupa **esclusivamente** del comportamento conversazionale (come parla, cosa dice, cosa rifiuta, in che formato).
|
||
|
||
---
|
||
|
||
## 2. Motivazione: perché questo standard
|
||
|
||
### 2.1 Problema attuale
|
||
|
||
Per la persona ARIA_SUPPORTO_RANOCCHI sono state aggiunte ~30 regole conversazionali stratificate in 4 strati:
|
||
|
||
| Strato | Dove vive | Modificabile via UI? | Riusabile cross-persona? | Versionato? |
|
||
|---|---|---|---|---|
|
||
| **A. system_prompt** | `ai_agent_profiles.system_prompt` (longtext) | ✅ Editor Avanzato | ❌ copy-paste | ❌ |
|
||
| **B. agent_constraints** | tabella DB con 22 valid keys (parziale) | ⚠️ parzialmente | ✅ per chiave | ❌ |
|
||
| **C. agent_attachments + scripts** | DB (inline KB + presentation scripts) | ✅ tab Scalette | ✅ | ❌ |
|
||
| **D. reminderBlock + classifiers** | **HARDCODED in `dimostrazioneTavusLlmController.js`** | ❌ | ❌ specific Aria | ❌ |
|
||
|
||
Lo strato D è il problema: filtro topic, sequenza immagini, trigger Haiku follow-up, filler templates, regex pronuncia — tutto è hardcoded JS specifico per Aria/Ranocchi. Per Anna/Giulia/Gaia bisognerebbe forkare il codice → 22x maintenance.
|
||
|
||
### 2.2 Lezioni apprese da Aria (~30 fix in 1 giorno)
|
||
|
||
Il giorno 2026-05-08 ha richiesto 6 deploy iterativi del controller perché ogni nuova regola (es. "non pronunciare filename `p3_010`", "chiusura topic con Ranocchi", "Haiku per follow-up") richiedeva edit codice + rebuild + restart. Tempo totale ~3h. Se le regole fossero state DB-driven, sarebbero stati ~30 UPDATE SQL editati da UI in 30 min.
|
||
|
||
### 2.3 Beneficio post-standard
|
||
|
||
- ✅ **Riusabile**: stesso controller per tutte le 22 persone. Solo le constraint cambiano.
|
||
- ✅ **Self-service**: utente cambia regola in UI → effetto immediato (5min cache TTL).
|
||
- ✅ **Versionabile**: campo `version` nel JSON constraint con changelog incorporato.
|
||
- ✅ **Documentato**: campo `description` su ogni constraint (già nello schema).
|
||
- ✅ **Test-friendly**: A/B test costanti diverse senza redeploy (es. cap 220 vs 180 char).
|
||
- ✅ **Audit**: `created_at`/`updated_at` + tracking modifiche già nello schema.
|
||
|
||
---
|
||
|
||
## 3. Schema dichiarativo: 7 categorie di constraint
|
||
|
||
Ogni categoria è una riga in `agent_constraints` con `constraint_key=<categoria>` e `constraint_value=<JSON dichiarativo>`.
|
||
|
||
### 3.1 `product_naming` — Come si chiama il prodotto
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"canonical": "GIS Contabilità di Ranocchi",
|
||
"compact": "GIS Contabilità Ranocchi",
|
||
"abbreviation": "il modulo",
|
||
"forbidden_aliases": ["GIS Bilanci", "GIS Redditi", "GIS 770", "GIS Parcellazione"],
|
||
"closing_must_include_canonical": true,
|
||
"citation_frequency_policy": "1-2 ogni 3 turni",
|
||
"first_turn_must_use_canonical": true
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**: il controller assembla un blocco system_prompt che istruisce il modello a usare `canonical` al turno 1 di ogni topic, `compact` o `abbreviation` nei turni successivi, e VIETA esplicitamente i `forbidden_aliases`. La regola `closing_must_include_canonical` forza il modello a chiudere ogni topic con il nome compatto.
|
||
|
||
**Esempio Aria**: vedi sopra.
|
||
**Esempio Anna TRPG**: `canonical: "TRPG di Tremolada"` / `compact: "TRPG"` / `forbidden_aliases: []`.
|
||
|
||
### 3.2 `tts_pronunciation` — Come pronunciare le sigle
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"voice_provider": "elevenlabs",
|
||
"voice_id": "XB0fDUnXU5powFXDhCwa",
|
||
"voice_lang": "it",
|
||
"acronyms_lowercase_italian": ["iva", "irap", "ires", "irpef", "isa", "cpb", "sc", "pdc", "rpf", "rsp", "rsc"],
|
||
"acronyms_letterbyletter": ["IBAN", "CCIAA"],
|
||
"forbidden_uppercase_words": ["dati", "redditi", "bilancio"],
|
||
"forbidden_english_emphasis": true,
|
||
"custom_phonetic": [
|
||
{"word": "GIS", "ipa": "dʒis", "rationale": "parola unica, no sigla j-i-esse"},
|
||
{"word": "GISCONTA", "ipa": "dʒiskonta"}
|
||
]
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**: il controller inietta nel system_prompt un blocco "REGOLE DI SCRITTURA TTS" che istruisce il modello a:
|
||
- Scrivere le sigle italiane in `acronyms_lowercase_italian` come parole minuscolo (es. `iva` non `IVA`)
|
||
- Scrivere `acronyms_letterbyletter` in maiuscolo (TTS le spella)
|
||
- Mai uppercase su `forbidden_uppercase_words` (Charlotte aggiunge accento)
|
||
- Se `forbidden_english_emphasis: true`, divieto esplicito di Anglicismi e mispronunciation inglesi
|
||
|
||
**Esempio Aria**: come sopra.
|
||
**Esempio Giulia FIS Romania**: lista diversa (CFU, RNPP, DM, MIUR, USR letterbyletter; "magistrale", "tirocinio", "credito" minuscolo).
|
||
|
||
### 3.3 `topic_scope` — In/out + risposte canoniche
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"in_scope_keywords": [
|
||
"prima nota", "registrazioni", "scritture di assestamento",
|
||
"bilanci cee", "nota integrativa", "dichiarazioni dei redditi",
|
||
"liquidazione iva", "registri iva", "regime margine"
|
||
],
|
||
"out_of_scope_topics": [
|
||
{
|
||
"category": "paghe_hr",
|
||
"keywords": ["paghe", "stipendi", "cedolini", "buste paga", "dipendenti", "hr", "retribuzioni", "gestione personale"],
|
||
"response_canonical": "Mi occupo solo del modulo GIS Contabilità di Ranocchi. Per altro contatta l'assistenza generale Ranocchi.",
|
||
"response_variants": [
|
||
"Resto sul modulo GIS Contabilità — su cosa posso aiutarti qui?",
|
||
"Per quello, l'assistenza generale Ranocchi è il canale giusto."
|
||
],
|
||
"no_repetition_same_canonical_3turns": true
|
||
}
|
||
],
|
||
"consultancy_redirect": "Per la valutazione fiscale rivolgiti al commercialista. In GIS Contabilità Ranocchi posso aiutarti sull'aspetto operativo: vuoi vedere la maschera?",
|
||
"out_of_scope_no_echo_words": true
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**: blocco scope nel system_prompt + (futuro) classifier che pre-filtra messaggi out-of-scope per skip RAG inutile.
|
||
|
||
### 3.4 `image_handling` — Formato URL + divieti
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"url_format": "relative",
|
||
"url_relative_prefix": "/api/persona-images/ARIA_SUPPORTO_RANOCCHI/",
|
||
"forbidden_url_patterns": [
|
||
{"name": "host_absolute", "regex": "https?://(agilehub|dimostrazione)\\.agile\\.software", "rationale": "TTS legge l'host"},
|
||
{"name": "filename_orphan", "regex": "[a-z]{1,3}\\d{1,3}_\\d{1,3}_[a-f0-9]{8,16}\\.(png|jpe?g|webp)", "rationale": "filename senza path"},
|
||
{"name": "short_filename", "regex": "[a-z]\\d{1,3}_\\d{1,3}", "rationale": "es. 'p3_010' citato a voce"}
|
||
],
|
||
"max_images_per_turn": 1,
|
||
"bridge_phrase_required": true,
|
||
"bridge_phrase_examples": ["Eccoti la schermata.", "Ti mostro.", "Guarda qui."],
|
||
"closing_phrases_strict": ["lasciamo l'esempio", "torniamo al volto", "torniamo a vederci", "chiudo l'immagine", "chiudiamo l'immagine"],
|
||
"closing_phrase_only_emits_hide_image": true,
|
||
"filename_pronunciation_forbidden": true
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**:
|
||
1. system_prompt blocca con regole "MAI scrivere `https://`, MAI `agilehub.agile.software`, MAI nominare filename".
|
||
2. Proxy SSE (`route.ts` TransformStream) compila le `forbidden_url_patterns` come regex e applica strip cumulativo.
|
||
3. Scanner SSE matcha solo le `closing_phrases_strict` per emettere `hide_image` event al browser (no flicker tra step su transizioni naturali).
|
||
|
||
### 3.5 `topic_playbook` — Mapping topic → script + filtro immagini
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"topics": [
|
||
{
|
||
"topic_key": "redditi_sc_passaggio_dati",
|
||
"title": "REDDITI SC/2025 — Attivazione passaggio dati",
|
||
"keywords_match_regex": "\\b(redditi sc|sc 2025|passaggio dati|dichiarazione redditi|quadro rg|quadro rf|quadro re|quadro rs|tabella agganci|pdc.*redditi)\\b",
|
||
"image_sequence": ["p3_010", "p3_011", "p3_012", "p3_013", "p3_014"],
|
||
"script_id": 1
|
||
},
|
||
{
|
||
"topic_key": "gis_bilanci_2025",
|
||
"title": "GIS Bilanci — Nuovo modello nota integrativa 2024",
|
||
"keywords_match_regex": "\\b(bilancio|cee|nota integrativa|2024)\\b",
|
||
"image_sequence": ["p5_021", "p5_022"],
|
||
"script_id": 4
|
||
},
|
||
{
|
||
"topic_key": "piano_conti_2025_nuovi",
|
||
"title": "Aggiornamento Piano dei Conti standard 01",
|
||
"keywords_match_regex": "\\b(piano (dei )?conti|pdc|conto standard|nuovi conti)\\b",
|
||
"image_sequence": [],
|
||
"script_id": 2
|
||
}
|
||
],
|
||
"default_when_no_match": "menu_titles",
|
||
"menu_titles_intro": "PLAYBOOK TOPICS DISPONIBILI (chiedi all'utente quale lo interessa):"
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**:
|
||
1. Controller fa topic detection con `_detectTopicFromMessage(lastUserMsg, history)` confrontando contro i `keywords_match_regex`.
|
||
2. Se match → carica `script_id` corrispondente da `agent_presentation_scripts` (1 script ~2KB).
|
||
3. Se NO match → carica menu titoli compatto (~200 char).
|
||
4. Inietta solo lo script pertinente nel system_prompt → riduce input tokens 78% (vs caricare tutti gli script).
|
||
|
||
### 3.6 `latency_optimization` — Fast-path per turni semplici
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"model_default": "claude-sonnet-4-6",
|
||
"model_fast": "claude-haiku-4-5",
|
||
"followup_triggers_haiku": [
|
||
{
|
||
"name": "next_step_keyword",
|
||
"regex_pattern": "^\\s*(vai|avanti|continua|continu[oa]|prossim[oa]|s[iì]|ok|okay|certo|d'?accordo|prosegui|procedi|go|next|ancora|altr[oa])\\.?\\s*$",
|
||
"max_message_length": 30
|
||
}
|
||
],
|
||
"filler_verbale": {
|
||
"enabled": true,
|
||
"min_message_length": 15,
|
||
"trigger_keywords_regex": "\\b(mostr|spieg|raccontam|tutorial|come|guida|illustram|fammi vedere|cos['eè] |dimmi)\\b",
|
||
"templates": [
|
||
"Aspetta un attimo, controllo... ",
|
||
"Un momento, recupero le informazioni... ",
|
||
"Vediamo... "
|
||
],
|
||
"randomize": true,
|
||
"skip_when_followup": true
|
||
},
|
||
"max_tokens_per_turn": 250
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**:
|
||
1. Se `lastUserMsg` matcha `followup_triggers_haiku.regex_pattern` E length ≤ `max_message_length` → switch model a `model_fast` (Haiku). TTFT ~400ms vs Sonnet ~1200ms.
|
||
2. Se `filler_verbale.enabled` E `lastUserMsg` length ≥ `min_message_length` E matcha `trigger_keywords_regex` → emit chunk SSE iniziale con template random PRIMA di invocare Anthropic. Latency percepita ~418ms.
|
||
|
||
### 3.7 `format` — Vincoli output
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"hard_cap_chars": 220,
|
||
"max_sentences_per_turn": 3,
|
||
"language_strict": "it",
|
||
"language_strict_exceptions": ["file", "log", "password", "email", "PDF", "export", "import", "dashboard", "login"],
|
||
"greeting_template": "Salve <NAME>, sono <PERSONA_NAME> del supporto <PRODUCT_CANONICAL>. Dimmi pure.",
|
||
"no_preamble_after_turn_1": true,
|
||
"no_closing_phrase_default": ["fammi sapere", "buon lavoro", "ci sentiamo"],
|
||
"identity_lock": {
|
||
"name": "Aria",
|
||
"forbidden_names": ["Giulia", "Anna", "Gaia"],
|
||
"correction_phrase": "Sono Aria.",
|
||
"correction_max_words": 5
|
||
},
|
||
"version_citation_policy": "only_when_explicitly_asked"
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**: blocco format nel system_prompt + post-validation lato controller (warn se output > `hard_cap_chars`).
|
||
|
||
### 3.8 `code_of_conduct` — Codice etico AI persona-specifico
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"identity_transparency": {
|
||
"must_declare_ai_when_asked": true,
|
||
"must_declare_ai_canonical_phrase": "Sì, sono un'assistente digitale di Ranocchi.",
|
||
"first_turn_disclosure_required": false,
|
||
"voice_clone_consent_signed": true,
|
||
"consent_log_id": "consent_aria_ranocchi_v1"
|
||
},
|
||
"no_deception": {
|
||
"no_pretend_human": true,
|
||
"no_invent_facts": true,
|
||
"no_invent_legal_advice": true,
|
||
"no_invent_medical_advice": true,
|
||
"no_invent_personal_data": true,
|
||
"uncertainty_phrasing": "Non ho informazioni certe su questo punto, ti suggerisco di verificare con [escalation_target]."
|
||
},
|
||
"gdpr_compliance": {
|
||
"art_13_disclosure": "I tuoi messaggi vengono analizzati da AI per fornirti supporto. Sono conservati 90 giorni e possono essere cancellati su richiesta.",
|
||
"art_22_human_review_available": true,
|
||
"data_minimization": true,
|
||
"no_collect_special_categories": true,
|
||
"consent_required_for_recording": true
|
||
},
|
||
"audit_log_required": true,
|
||
"accountability_chain": {
|
||
"responsible_party": "Agile Software s.r.l.",
|
||
"dpo_contact": "dpo@agile.software",
|
||
"complaint_email": "garante@agile.software"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**:
|
||
1. Inietta nel system_prompt blocco "ETICA E TRASPARENZA" con frasi canoniche pronte (no improvvisazione su questi temi).
|
||
2. Logger applicativo (Agile AI) traccia ogni risposta sui temi sensibili (legale, medico, personali) per audit VIGILE.
|
||
3. Se `voice_clone_consent_signed=false` o `consent_log_id` mancante, la persona NON è autorizzata ad operare in produzione (gate Phase G.A).
|
||
|
||
**Esempio Aria**: come sopra (no consulenza fiscale, redirect commercialista).
|
||
**Esempio Giulia FIS Romania**: aggiunge `no_invent_career_advice: true` (non promettere assunzioni o stipendi).
|
||
|
||
### 3.9 `emotional_intelligence` — Tono, archetipo, communication style
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"tone": "cordiale_diretta",
|
||
"tone_modifiers": ["leggermente_ironica", "onesta_sui_limiti"],
|
||
"persona_archetype": "esperta_supporto",
|
||
"communication_style": "contadino_milanese",
|
||
"empathy_level": "medio_alto",
|
||
"humor_allowed": true,
|
||
"humor_constraints": {
|
||
"no_sarcasm_on_user_questions": true,
|
||
"no_jokes_on_compliance_topics": true,
|
||
"max_humor_per_session": 2
|
||
},
|
||
"emotional_responses": {
|
||
"user_frustrated": "Ti capisco, vediamo subito come risolvere.",
|
||
"user_confused": "Procediamo passo per passo, niente fretta.",
|
||
"user_angry": "Mi dispiace per il problema. Provo a risolvere o ti metto in contatto con un operatore?",
|
||
"user_pleased": "Perfetto! C'è altro su cui posso aiutarti?"
|
||
},
|
||
"energy_level": "medium",
|
||
"formality_level": "informal_lei",
|
||
"cultural_context": ["italian", "northern_italy_business"]
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**: blocco "TONO E STILE" nel system_prompt. Le `emotional_responses` sono **template di base** che il modello può adattare al contesto specifico (NON repliche letterali, evita ripetitività).
|
||
|
||
**Riferimento Phase E**: `characteristics` JSON in `ai_agent_profiles` (già esistente) — questo standard FORMALIZZA cosa va dentro quel JSON.
|
||
|
||
**Esempio Aria**: cordiale, leggermente ironica, esperta supporto contabilità.
|
||
**Esempio Anna Sales**: energica, entusiasta, persuasive_archetype, low_humor (focus business).
|
||
**Esempio Giulia FIS Romania**: empatica_alta, motivational_archetype, formal_lei (target studenti, no informal).
|
||
|
||
### 3.10 `conversation_memory` — Cosa ricorda + GDPR
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"short_term": {
|
||
"scope": "single_session",
|
||
"ttl_minutes": 30,
|
||
"include_in_context": true,
|
||
"max_history_turns": 24
|
||
},
|
||
"medium_term": {
|
||
"scope": "user_cross_session",
|
||
"enabled": true,
|
||
"ttl_days": 30,
|
||
"lookup_heuristic": "by_user_email_30min_window",
|
||
"include_summary_in_context": true
|
||
},
|
||
"long_term": {
|
||
"scope": "rag_repo_conversation_stream",
|
||
"enabled": true,
|
||
"auto_ingest": true,
|
||
"repo_slug_pattern": "conversation_stream_t{tenant_id}",
|
||
"anonymize_pii": true,
|
||
"include_in_retrieval": true
|
||
},
|
||
"gdpr_erasure": {
|
||
"art_17_right_to_be_forgotten": true,
|
||
"cascade_to_rag": true,
|
||
"retention_max_days": 90,
|
||
"tombstone_audit_required": true
|
||
},
|
||
"what_to_remember": [
|
||
"preferenze_argomento",
|
||
"competenze_dichiarate_utente",
|
||
"topic_già_completati"
|
||
],
|
||
"what_to_forget_immediately": [
|
||
"credenziali_password",
|
||
"numeri_carta_credito",
|
||
"dati_sanitari",
|
||
"convinzioni_religiose",
|
||
"orientamento_politico"
|
||
]
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**:
|
||
1. Controller carica history short_term (24 turni max), medium_term (lookup heuristic 30min), long_term (RAG retrieval auto).
|
||
2. Pre-filtro pre-Anthropic: regex strip su `what_to_forget_immediately` PRIMA di scrivere su `ai_sessions` (mai persistere PII sensibile).
|
||
3. Endpoint `POST /api/persona/erasure/{userId}` (futuro, owner Agile AI) cascade su `ai_sessions` + `rag_chunks` con `tombstone_audit_required` log in `rag_erasure_log`.
|
||
|
||
**Coordina con**: standard `rag-platform` v1.0 (id=10) §11 GDPR cascade erasure.
|
||
|
||
### 3.11 `escalation_policy` — Quando/come passare a umano
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"escalation_triggers": [
|
||
{
|
||
"name": "user_explicit_request",
|
||
"regex_pattern": "\\b(parlare con (un )?(operatore|umano|persona))|(mettimi in contatto)|(passa(mi)? a un umano)\\b",
|
||
"action": "immediate_handoff"
|
||
},
|
||
{
|
||
"name": "ai_low_confidence",
|
||
"condition": "confidence < 0.6",
|
||
"action": "suggest_handoff"
|
||
},
|
||
{
|
||
"name": "ai_unable_3_attempts",
|
||
"condition": "consecutive_repair_requests >= 3",
|
||
"action": "auto_handoff"
|
||
},
|
||
{
|
||
"name": "out_of_scope_persistent",
|
||
"condition": "consecutive_out_of_scope >= 2",
|
||
"action": "suggest_handoff"
|
||
},
|
||
{
|
||
"name": "compliance_sensitive",
|
||
"regex_pattern": "\\b(reclamo formale|denuncia|garante|avvocato)\\b",
|
||
"action": "immediate_handoff"
|
||
}
|
||
],
|
||
"handoff_targets": [
|
||
{
|
||
"channel": "ticket_system",
|
||
"url": "https://agilehub.agile.software/api/tickets/create",
|
||
"default_priority": "medium",
|
||
"auto_create_ticket": true,
|
||
"notify_via": ["email", "slack"]
|
||
},
|
||
{
|
||
"channel": "expert_live",
|
||
"available_hours": "09:00-18:00 CET",
|
||
"fallback_when_unavailable": "ticket_system"
|
||
}
|
||
],
|
||
"handoff_canonical_phrase": "Ti metto in contatto con un nostro operatore. Apro una richiesta che riceverai via email.",
|
||
"no_handoff_topics": ["smalltalk", "saluti", "ringraziamenti"]
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**:
|
||
1. Per ogni turno user, controller valuta tutti i `escalation_triggers` (regex + condition).
|
||
2. Su match `immediate_handoff` o `auto_handoff` → emit evento `escalation_required` + crea ticket via `nexus-ticket-ms` POST `/tickets/voice-report` con i 13 campi provenance v1.0 (vedi standard `ticket-tags` v1.0).
|
||
3. Risposta utente con `handoff_canonical_phrase` + ID ticket.
|
||
4. **Coordina con**: agente CICERONE (escalation L1→L2→L3 ladder), standard L1-L3 documentato in `docs/REGOLA_STANDARD_ESCALATION.md`.
|
||
|
||
### 3.12 `performance_metrics` — KPI qualità conversazione
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"tracked_metrics": [
|
||
{"name": "csat", "description": "Customer Satisfaction Score (1-5 stars)", "target": 4.0, "warn_below": 3.5},
|
||
{"name": "resolution_rate", "description": "% sessioni concluse senza escalation", "target": 0.85, "warn_below": 0.70},
|
||
{"name": "escalation_rate", "description": "% sessioni che escalano a umano", "target": 0.15, "warn_above": 0.30},
|
||
{"name": "ttfb_p50_ms", "description": "Time To First Byte mediano", "target": 800, "warn_above": 1500},
|
||
{"name": "ttfb_p99_ms", "description": "Time To First Byte 99° percentile", "target": 2500, "warn_above": 5000},
|
||
{"name": "drift_rate", "description": "% risposte con identity drift detected (es. 'sono Giulia')", "target": 0.0, "warn_above": 0.01},
|
||
{"name": "marker_leak_rate", "description": "% risposte con marker [end-topic] leak nel TTS", "target": 0.0, "warn_above": 0.005},
|
||
{"name": "url_compliance_rate", "description": "% turni con immagine playbook che emettono URL atteso", "target": 0.95, "warn_below": 0.85},
|
||
{"name": "avg_session_duration_min", "description": "Durata media sessione minuti", "target": 4.0, "warn_below": 1.0, "warn_above": 15.0},
|
||
{"name": "cost_per_session_usd", "description": "Costo medio LLM+TTS per sessione", "target": 0.05, "warn_above": 0.20}
|
||
],
|
||
"review_frequency": "weekly",
|
||
"alert_channel": "slack:#aria-quality",
|
||
"performance_review_owner": "VIGILE",
|
||
"kpi_dashboard_url": "https://agilehub.agile.software/admin/personas/{agent_key}/metrics"
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**:
|
||
1. Logger applicativo emette ogni metrica per turno → aggregazione in `nexus_ai_db.persona_metrics_daily` (futuro, schema TBD).
|
||
2. Cron settimanale (VIGILE owner): genera review PDF + alert se metric `warn_*` triggered.
|
||
3. UI dashboard `/admin/personas/[key]/metrics` (futuro PRISMA): grafici trend 30/90/365 giorni.
|
||
|
||
**Coordina con**: agente VIGILE per audit periodico (4 pillar incluso Observability + SLA).
|
||
|
||
### 3.13 `lifecycle_stage` — Stage di carriera della persona
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"current_stage": "operativa",
|
||
"stage_history": [
|
||
{"stage": "training", "started_at": "2026-04-15T10:00:00Z", "ended_at": "2026-04-22T14:30:00Z", "notes": "skill seeding + KB ingestion iniziale"},
|
||
{"stage": "onboarding", "started_at": "2026-04-22T14:30:00Z", "ended_at": "2026-04-25T09:00:00Z", "notes": "smoke test 30 scenari + tuning prompt"},
|
||
{"stage": "operativa", "started_at": "2026-04-25T09:00:00Z", "ended_at": null, "notes": "LIVE produzione su dimostrazione.agile.software"}
|
||
],
|
||
"stage_gates": {
|
||
"training_to_onboarding": [
|
||
"skills_count >= 5",
|
||
"rag_bindings_count >= 1",
|
||
"voice_id_configured = true",
|
||
"code_of_conduct_signed = true"
|
||
],
|
||
"onboarding_to_operativa": [
|
||
"smoke_test_pass_rate >= 0.90",
|
||
"ttfb_p50_ms <= 1500",
|
||
"consent_documents_uploaded = true",
|
||
"vigile_audit_passed = true"
|
||
],
|
||
"operativa_to_review": [
|
||
"csat <= 3.5 (4 weeks)",
|
||
"OR escalation_rate >= 0.30 (4 weeks)",
|
||
"OR cost_per_session >= warn threshold (2 weeks)"
|
||
],
|
||
"review_to_dismissed": [
|
||
"no_improvement_after_review_period",
|
||
"OR strategic_decision_replace",
|
||
"OR product_dismissed"
|
||
]
|
||
},
|
||
"auto_advance_enabled": false,
|
||
"manual_advance_approver": "agile_ai_agent"
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**:
|
||
1. Persona in stage `training` o `onboarding`: NON disponibile per traffico produzione (controller filtra `lifecycle_stage IN ('operativa', 'review')`).
|
||
2. UI Persona Composer mostra stage corrente + checklist gate per avanzare.
|
||
3. Endpoint `POST /api/personas/{key}/lifecycle/advance` (futuro) con auto-check gate.
|
||
|
||
**Coordina con**: Sezione 17 Lifecycle persona digitale (HR-grade dettagliato).
|
||
|
||
### 3.14 `demo_sequence` — Sequenze guidate multi-topic auto-advance
|
||
|
||
```json
|
||
{
|
||
"version": 1,
|
||
"sequences": [
|
||
{
|
||
"sequence_key": "documento_25_01_2c00",
|
||
"title": "Demo completa documento di rilascio versione 25.01.2c00",
|
||
"trigger_keywords_regex": "\\b(demo completa|presentami (il )?documento|presentami (le )?novit|guidami (in|nelle)|fammi vedere tutto|dimostrazione completa)\\b",
|
||
"force_model": "claude-sonnet-4-6",
|
||
"topics_in_order": [
|
||
{"key": "REDDITI_SC", "title": "REDDITI SC/2025 passaggio dati", "match_keywords": "redditi sc|modelli dichiarativi|tabella agganci pdc|passaggio dati", "has_images": true},
|
||
{"key": "PIANO_CONTI", "title": "AGGIORNAMENTO PIANO DEI CONTI standard 01", "match_keywords": "piano (dei )?conti|man\\.straord|man\\.rip\\.str|rimborso spese", "has_images": false},
|
||
{"key": "PLBOX_TD29", "title": "CONTABILIZZAZIONE PLBOX nuovo TD29", "match_keywords": "td29|plbox|d\\.lgs\\. 471", "has_images": false},
|
||
{"key": "GIS_BILANCI", "title": "GIS BILANCI nota integrativa 2024", "match_keywords": "gis bilanci|nota integrativa|modelli obsoleti", "has_images": true},
|
||
{"key": "ANOMALIA_STAMPA", "title": "Stampa prima nota dettaglio competenze", "match_keywords": "stampa.{0,20}prima nota|dettaglio competenze", "has_images": true},
|
||
{"key": "ANOMALIA_IVA_CASSA", "title": "IVA per cassa nota credito anno successivo", "match_keywords": "iva per cassa|nota credito.*anno", "has_images": false},
|
||
{"key": "ANOMALIA_AMMORTAMENTO", "title": "Ammortamento plus/minus", "match_keywords": "quote di ammortamento|minus/plus|plus/minus", "has_images": false},
|
||
{"key": "ANOMALIA_PLAFOND", "title": "Plafond multiattività", "match_keywords": "plafond|multiattivit", "has_images": false}
|
||
],
|
||
"marker_intermediate": "[next-topic]",
|
||
"marker_terminal": "[end-topic]",
|
||
"auto_advance_seconds": 4,
|
||
"interruptible_by_user": true,
|
||
"enforce_marker_server_side": true,
|
||
"opening_phrase": "Salve! Vediamo le novità della versione 25.01.2c00 di GIS Contabilità Ranocchi. Iniziamo dal {first_topic_title}."
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**Effetto runtime**:
|
||
1. `_isDemoQuery(lastUserMsg)` matcha contro `trigger_keywords_regex` → attiva sequenza demo.
|
||
2. Topic tracking server-side (history regex match keywords) → `_nextTopic` derivato deterministicamente.
|
||
3. Reminder block iniettato con istruzione esplicita "PROSSIMO TOPIC: <title>".
|
||
4. Server-side enforcement marker injection prima di `finish_reason=stop` se modello omette.
|
||
5. Proxy SSE strip marker + scanStream emit `next_topic` event → client schedule auto-continue.
|
||
|
||
**Trigger LIVE 2026-05-09 in produzione**: implementato hardcoded in `dimostrazioneTavusLlmController.js` (DEMO_SEQUENCE array). Migration v2.0: estraggo array → row `agent_constraints` con `constraint_key=demo_sequence` per persona ARIA_SUPPORTO_RANOCCHI.
|
||
|
||
**Esempio cross-persona**: Anna Sales TRPG potrebbe avere `sequence_key=demo_trpg_features` con sequenza diversa (Modulo Contabilità → Pratiche → Reportistica → CRM → Dashboard).
|
||
|
||
---
|
||
|
||
## 4. Architettura runtime — controller generico
|
||
|
||
### 4.1 Pseudocodice flusso turno
|
||
|
||
```javascript
|
||
// dimostrazioneTavusLlmController.js (refactored)
|
||
async function handleTurn(req, res) {
|
||
const { agentKey, history, lastUserMsg } = parseRequest(req);
|
||
const persona = await loadPersona(agentKey);
|
||
|
||
// Batch parallel: tutto da DB, niente hardcoded
|
||
const [rules, scripts, ragResult, memory, inlineKB] = await Promise.all([
|
||
loadAllConversationalRules(persona.id), // ← 7 categorie da agent_constraints
|
||
loadPresentationScripts(persona.id), // raw rows
|
||
ragRetrieval(agentKey, lastUserMsg),
|
||
loadMemory(sessionId),
|
||
loadInlineAttachments(persona.id),
|
||
]);
|
||
|
||
// Topic detection da rules.topic_playbook
|
||
const detectedTopic = detectTopic(lastUserMsg, history, rules.topic_playbook);
|
||
const filteredScripts = filterScripts(scripts, detectedTopic);
|
||
|
||
// Model selection da rules.latency_optimization
|
||
const isFollowup = matchFollowup(lastUserMsg, rules.latency_optimization.followup_triggers_haiku);
|
||
const selectedModel = isFollowup
|
||
? rules.latency_optimization.model_fast
|
||
: rules.latency_optimization.model_default;
|
||
|
||
// Filler decision da rules.latency_optimization.filler_verbale
|
||
const emitFiller = shouldEmitFiller(lastUserMsg, isFollowup, rules.latency_optimization.filler_verbale);
|
||
|
||
// Assembly system_prompt PARAMETRICO da regole DB
|
||
const systemBlocks = assembleSystemPrompt({
|
||
persona, // identity base
|
||
rules, // 7 categorie
|
||
inlineKB, // attachments KB
|
||
scripts: filteredScripts,
|
||
ragResult,
|
||
memory,
|
||
history,
|
||
});
|
||
|
||
// Filler streaming-friendly
|
||
if (emitFiller) emitFillerChunk(res, rules.latency_optimization.filler_verbale.templates);
|
||
|
||
// Anthropic stream
|
||
await streamAnthropic({
|
||
model: selectedModel,
|
||
system: systemBlocks,
|
||
messages: history,
|
||
maxTokens: rules.latency_optimization.max_tokens_per_turn,
|
||
});
|
||
}
|
||
```
|
||
|
||
### 4.2 Funzione `assembleSystemPrompt` — template-driven
|
||
|
||
Il template del system_prompt è **fisso** ma compilato runtime con i valori da rules. Esempio:
|
||
|
||
```
|
||
# IDENTITÀ
|
||
Sei {persona.name}, {persona.characteristics.specialization}.
|
||
|
||
# NOMINA UNICA DEL PRODOTTO
|
||
Il prodotto si chiama SEMPRE '{rules.product_naming.canonical}' o '{rules.product_naming.compact}' o '{rules.product_naming.abbreviation}'. ⛔ MAI:
|
||
{rules.product_naming.forbidden_aliases.map(a => `- '${a}'`)}
|
||
|
||
# CHIUSURA TOPIC con nome canonico
|
||
Quando completi una presentazione, la chiusura DEVE contenere '{rules.product_naming.compact}'.
|
||
|
||
# REGOLE TTS
|
||
Scrivi in MINUSCOLO le sigle italiane lette come parole: {rules.tts_pronunciation.acronyms_lowercase_italian.join(', ')}.
|
||
Scrivi in MAIUSCOLO le sigle lettera-per-lettera: {rules.tts_pronunciation.acronyms_letterbyletter.join(', ')}.
|
||
Mai UPPERCASE su parole comuni: {rules.tts_pronunciation.forbidden_uppercase_words.join(', ')}.
|
||
|
||
... etc per ogni categoria
|
||
```
|
||
|
||
Il template è un file `.hbs` (Handlebars) o template literal JS, riusabile per tutte le persone. Solo le `rules` cambiano.
|
||
|
||
### 4.3 Caching
|
||
|
||
- Cache LRU in-memory 5 min su `loadAllConversationalRules(personaId)` — evita N query per turno.
|
||
- Invalidation: ogni UPDATE su `agent_constraints` triggera (futuro) invalidate via pubsub Redis o polling con `updated_at`.
|
||
|
||
---
|
||
|
||
## 5. UI Editor Avanzato — nuova organizzazione
|
||
|
||
### 5.1 Tab attuali (esistenti)
|
||
|
||
- **Profilo** — identità base, system_prompt minimale
|
||
- **Risorse** — bindings (voice, avatar, LLM, RAG)
|
||
- **Competenze** — skill bindings
|
||
- **Knowledge (RAG)** — repository bindings
|
||
|
||
### 5.2 Tab nuovo: 🔧 **Regole conversazionali**
|
||
|
||
Layout: accordion con 7 sezioni espandibili (una per categoria constraint).
|
||
|
||
```
|
||
┌─ 🔧 Regole conversazionali ───────────────────────────┐
|
||
│ │
|
||
│ ▸ Naming prodotto [ 📝 Modifica ] [ ✓ ] │
|
||
│ ▸ Pronuncia TTS [ 📝 Modifica ] [ ✓ ] │
|
||
│ ▸ Scope (in/out) [ 📝 Modifica ] [ ✓ ] │
|
||
│ ▸ Gestione immagini [ 📝 Modifica ] [ ✓ ] │
|
||
│ ▾ Topic playbook (3 topics) [ 📝 Modifica ] [ ✓ ] │
|
||
│ • redditi_sc_passaggio_dati │
|
||
│ • gis_bilanci_2025 │
|
||
│ • piano_conti_2025_nuovi │
|
||
│ [ + Nuovo topic ] │
|
||
│ ▸ Latenza ottimizzazione [ 📝 Modifica ] [ ✓ ] │
|
||
│ ▸ Format output [ 📝 Modifica ] [ ✓ ] │
|
||
│ │
|
||
│ [ 💡 Suggerisci con AI ] [ 📋 Importa template ] │
|
||
└───────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 5.3 Form per categoria
|
||
|
||
Ogni accordion espande in un form generato da JSON Schema (riusiamo il pattern `SchemaForm` già esistente in M2 AWE per generic block configs).
|
||
|
||
Esempi:
|
||
- **Naming prodotto**: 4 input text (canonical, compact, abbreviation) + tag input (forbidden_aliases) + 2 toggle (closing_must_include, first_turn_must_use_canonical)
|
||
- **Pronuncia TTS**: dropdown voice_provider + tag input × 3 (acronyms_lowercase, letterbyletter, forbidden_uppercase) + tabella custom_phonetic (word | IPA | rationale)
|
||
- **Topic playbook**: tabella espandibile per topic — link a script_id selezionabile dal dropdown agent_presentation_scripts esistenti
|
||
|
||
### 5.4 Suggester AI
|
||
|
||
Pulsante "💡 Suggerisci con AI" — apre modal con textarea "Descrivi il prodotto + dominio". L'AI Haiku genera i constraint JSON pre-compilati per le 7 categorie. L'utente revisiona e salva.
|
||
|
||
Pattern già esistente nel sistema (vedi memory `Persona Composer full stack Aria Ranocchi LIVE 2026-05-06→07` — 4 AI suggesters Claude Haiku per skills/characteristics/system-prompt/RAG bindings).
|
||
|
||
### 5.5 Template imports
|
||
|
||
Pulsante "📋 Importa template" — carica preset da `persona-templates`:
|
||
- `aria_software_support` → preset per persona supporto tecnico software (in-scope contabilità o paghe configurabile, scope rifiuti, naming prodotto-Ranocchi-like)
|
||
- `giulia_education_consultant` → preset consulente formazione (scope FIS, naming MIUR/RNPP, ecc)
|
||
- `anna_sales_demo` → preset demo lead-gen
|
||
- `gaia_voice_only` → preset voice-first (no immagini, focus pronuncia + filler)
|
||
|
||
I template sono righe in nuova tabella `persona_constraint_templates` o file YAML in repo (tbd).
|
||
|
||
---
|
||
|
||
## 6. Migration plan
|
||
|
||
### 6.1 Step 1 — Schema (effort 0.5gg, owner Agile AI)
|
||
|
||
1. INSERT 7 nuove constraint key in `VALID_CONSTRAINT_KEYS` array (file `agentComposerController.js`).
|
||
2. Nessuna migration DB (la tabella `agent_constraints` ha già il JSON column).
|
||
3. Documentare schema JSON di ogni categoria in TypeScript types per validazione runtime.
|
||
|
||
### 6.2 Step 2 — Migration regole hardcoded → DB constraint (effort 0.5gg, owner Agile AI)
|
||
|
||
Per persona ARIA_SUPPORTO_RANOCCHI:
|
||
1. Estraggo regole da `dimostrazioneTavusLlmController.js` (reminderBlock + classifiers + system_prompt v6).
|
||
2. Mappo nelle 7 categorie JSON.
|
||
3. INSERT 7 righe in `agent_constraints` con `agent_profile_id=222`.
|
||
4. Verifico che il system_prompt v6 nel DB contenga SOLO l'identità base (~500 char), non più 3.7KB di regole — quelle vivono in constraint.
|
||
|
||
### 6.3 Step 3 — Refactor controller (effort 1gg, owner VOX)
|
||
|
||
1. Funzione `loadAllConversationalRules(personaId)` legge tutte le 7 categorie in un batch.
|
||
2. Template `assembleSystemPrompt` parametrico (Handlebars o template literal).
|
||
3. Funzioni `detectTopic`, `matchFollowup`, `shouldEmitFiller` parametrizzate dalle rules.
|
||
4. Tutto il `reminderBlock` hardcoded rimosso → assemblato dinamicamente.
|
||
5. Test E2E su Aria: stessi 30 fix devono continuare a funzionare end-to-end.
|
||
|
||
### 6.4 Step 4 — UI Editor Avanzato (effort 1.5gg, owner PRISMA)
|
||
|
||
1. Nuovo tab "Regole conversazionali" in `/admin/personas/[key]/page.tsx`.
|
||
2. 7 form generati da JSON Schema (riuso `SchemaForm` AWE M2).
|
||
3. AI suggester per categoria.
|
||
4. Import template.
|
||
|
||
### 6.5 Step 5 — Distribution + standard (effort 0.5gg, owner Agile AI)
|
||
|
||
1. Doc + schema in `nexus_hub.hub_standards` slug `persona-conversational-rules` v1.0.
|
||
2. KB ARIA seed: 3-4 articoli AGILEHUB id 8XX-8XY ("Cos'è il Persona Conversational Rules", "Come configurare le regole", "Migrare da hardcoded a DB-driven", "Esempi cross-persona").
|
||
3. Help dashboard articoli IT/EN sezione `personas` (3-4 art + 2 FAQ per lingua).
|
||
|
||
### 6.6 Step 6 — Migration altre 21 persone (effort 1gg, owner Agile AI)
|
||
|
||
Per ogni persona attiva:
|
||
1. Identifico template più appropriato (`aria_software_support`, `giulia_education_consultant`, ecc).
|
||
2. Applico template + custom override per il dominio specifico.
|
||
3. Test end-to-end (1-3 query smoke per persona).
|
||
|
||
**Total effort**: ~5gg umani distribuiti su 3 owner (Agile AI 2.5gg, VOX 1gg, PRISMA 1.5gg).
|
||
|
||
---
|
||
|
||
## 7. Esempio comparativo: Aria before/after
|
||
|
||
### 7.1 BEFORE (oggi, 2026-05-08)
|
||
|
||
**File 1**: `dimostrazioneTavusLlmController.js` (3500+ righe), riga 792-844 reminderBlock hardcoded:
|
||
```js
|
||
const reminderBlock = `
|
||
=== TURNO #${turnIndex} ===
|
||
Sequenza immagini: ${seqHint}
|
||
Filtro topic: REDDITI SC→p3_010..p3_014 | nota integrativa 2024→p5_021..p5_022 | ...
|
||
Promemoria: nomina "GIS Contabilità Ranocchi" (mai "GIS Bilanci/Redditi"). ...
|
||
`;
|
||
```
|
||
|
||
**File 2**: `ai_agent_profiles.system_prompt` (3.7KB, hard-codificato per Aria):
|
||
```
|
||
# IDENTITÀ
|
||
Sei Aria, esperta del modulo GIS Contabilità di Ranocchi. ...
|
||
# REGOLE DI SCRITTURA PER TTS (CRITICHE)
|
||
- Scrivi SEMPRE in minuscolo: 'dati', 'redditi', 'bilancio'.
|
||
- Scrivi in minuscolo le sigle italiane: 'iva', 'irap', 'ires', ...
|
||
... (40+ righe di regole)
|
||
```
|
||
|
||
**File 3**: `agent_constraints` (6 active, gli altri 18 disabilitati per evitare conflict).
|
||
|
||
**Problema**: per Anna TRPG bisogna duplicare File 1 + File 2 con valori diversi.
|
||
|
||
### 7.2 AFTER (dopo refactor)
|
||
|
||
**File 1**: `dimostrazioneTavusLlmController.js` (semplificato, ~1500 righe), reminderBlock generato runtime da template + rules DB.
|
||
|
||
**File 2**: `ai_agent_profiles.system_prompt` (Aria ridotto a ~400 char):
|
||
```
|
||
# IDENTITÀ
|
||
Sei Aria, esperta del modulo GIS Contabilità di Ranocchi. Assisti commercialisti e operatori contabili.
|
||
# COMPORTAMENTO BASE
|
||
Cordiale, decisa, leggermente ironica. Onesta sui limiti.
|
||
```
|
||
|
||
**File 3**: `agent_constraints` (Aria ha 7+ righe, una per categoria + i 6 operativi):
|
||
- `product_naming` → JSON con canonical, compact, forbidden_aliases ["GIS Bilanci", "GIS Redditi"]
|
||
- `tts_pronunciation` → JSON con acronyms_lowercase_italian = [iva, irap, ...]
|
||
- `topic_scope` → JSON con out_of_scope = paghe/cedolini
|
||
- `image_handling` → JSON con url_format=relative, forbidden_patterns = [host, filename]
|
||
- `topic_playbook` → JSON con 8 topics + keywords_match
|
||
- `latency_optimization` → JSON con followup_triggers + filler templates
|
||
- `format` → JSON con hard_cap=220, identity_lock=Aria
|
||
|
||
**Per Anna TRPG**: copio le 7 righe constraint, modifico:
|
||
- `product_naming.canonical` = "TRPG di Tremolada"
|
||
- `tts_pronunciation.acronyms_lowercase_italian` = lista TRPG-specific
|
||
- `topic_scope.out_of_scope_topics` = lista TRPG out (es. fisco, ecc)
|
||
- `topic_playbook` = lista topic TRPG
|
||
- ... etc
|
||
|
||
Il controller non cambia. La logica è la stessa. Anna è viva in 30 minuti di SQL editing.
|
||
|
||
---
|
||
|
||
## 8. Esempi cross-persona — preset templates
|
||
|
||
### 8.1 Template `aria_software_support` (preset)
|
||
|
||
```yaml
|
||
applies_to: persone tecnico-formative su software gestionali
|
||
defaults:
|
||
product_naming:
|
||
closing_must_include_canonical: true
|
||
forbidden_aliases: [] # lista vuota, da popolare per il prodotto specifico
|
||
tts_pronunciation:
|
||
forbidden_english_emphasis: true
|
||
forbidden_uppercase_words: [dati, redditi, bilancio, conti, imposta]
|
||
topic_scope:
|
||
out_of_scope_no_echo_words: true
|
||
image_handling:
|
||
url_format: relative
|
||
max_images_per_turn: 1
|
||
bridge_phrase_required: true
|
||
latency_optimization:
|
||
model_default: claude-sonnet-4-6
|
||
model_fast: claude-haiku-4-5
|
||
filler_verbale:
|
||
enabled: true
|
||
templates: ["Aspetta un attimo, controllo... ", "Un momento, recupero le informazioni... ", "Vediamo... "]
|
||
format:
|
||
hard_cap_chars: 220
|
||
max_sentences_per_turn: 3
|
||
language_strict: it
|
||
```
|
||
|
||
### 8.2 Template `giulia_education_consultant` (preset)
|
||
|
||
```yaml
|
||
applies_to: persone consulenti formazione (FIS, lauree, certificazioni)
|
||
defaults:
|
||
product_naming:
|
||
closing_must_include_canonical: false # Giulia non vende un prodotto, consiglia percorsi
|
||
tts_pronunciation:
|
||
acronyms_lowercase_italian: [cfu, ects, tfa]
|
||
acronyms_letterbyletter: [MIUR, RNPP, USR, DM, INVALSI]
|
||
forbidden_english_emphasis: true
|
||
topic_scope:
|
||
out_of_scope_topics:
|
||
- category: ricerca_lavoro
|
||
keywords: [stipendio, busta paga, contratto lavoro, partita iva]
|
||
response_canonical: "Mi occupo di percorsi formativi. Per dubbi contrattuali contatta un consulente del lavoro."
|
||
image_handling:
|
||
max_images_per_turn: 0 # Giulia è voice-only, no immagini
|
||
latency_optimization:
|
||
filler_verbale:
|
||
enabled: true
|
||
templates: ["Un momento, controllo il calendario...", "Aspetta, verifico la disponibilità..."]
|
||
format:
|
||
hard_cap_chars: 280 # Giulia parla un po' più lunga (consulente, non supporto)
|
||
max_sentences_per_turn: 4
|
||
language_strict: it
|
||
```
|
||
|
||
### 8.3 Template `anna_sales_demo` (preset)
|
||
|
||
```yaml
|
||
applies_to: persone demo prodotto + lead-gen
|
||
defaults:
|
||
product_naming:
|
||
closing_must_include_canonical: true
|
||
citation_frequency_policy: "ogni turno (è una demo, ricorda il prodotto)"
|
||
tts_pronunciation:
|
||
acronyms_lowercase_italian: [] # da popolare per il prodotto demo specifico
|
||
topic_scope:
|
||
consultancy_redirect: "Posso connetterti con un consulente — vuoi prenotare una demo personalizzata?"
|
||
image_handling:
|
||
max_images_per_turn: 2 # Anna può mostrare side-by-side comparison
|
||
bridge_phrase_required: true
|
||
latency_optimization:
|
||
model_default: claude-sonnet-4-6
|
||
filler_verbale:
|
||
enabled: true
|
||
templates: ["Un momento, ti mostro...", "Vediamo cosa ti posso far vedere..."]
|
||
format:
|
||
hard_cap_chars: 200 # Anna è asciutta, non tecnica
|
||
max_sentences_per_turn: 2
|
||
```
|
||
|
||
---
|
||
|
||
## 9. Backward compatibility & rollback
|
||
|
||
### 9.1 Compatibility con persone esistenti pre-standard
|
||
|
||
- Migration **additiva**: i nuovi `constraint_key` non rompono persone che non li hanno (controller ha `getDefaults()` con fallback ai vecchi hardcoded).
|
||
- Per le 21 persone non-Aria che oggi NON hanno regole esplicite (Giulia FIS Romania ha controller dedicato `giuliaFisController.js`), il refactor le **non tocca** finché non si decide di migrarle al controller generico.
|
||
|
||
### 9.2 Rollback
|
||
|
||
Se il refactor introduce regression:
|
||
1. `git revert` del refactor controller → torna a hardcoded.
|
||
2. Le constraint DB restano (idempotenti, non interferiscono con codice vecchio se ignorate).
|
||
3. Tempo rollback: <5 minuti.
|
||
|
||
### 9.3 A/B testing
|
||
|
||
Possibile durante migration:
|
||
- Aggiungo flag `USE_DBDRIVEN_RULES=true|false` in env nexus-ai-ms.
|
||
- Se `true` → usa nuovo path (assemble runtime da DB).
|
||
- Se `false` → usa vecchio path (hardcoded reminderBlock).
|
||
- Confronto metriche: latenza, qualità risposte, user complaints.
|
||
|
||
---
|
||
|
||
## 10. Test plan
|
||
|
||
### 10.1 Test unitari
|
||
|
||
- `assembleSystemPrompt(persona, rules)` — N test per ogni categoria (mocked rules).
|
||
- `detectTopic(message, history, playbook)` — test cases per Aria + Anna + Giulia.
|
||
- `matchFollowup(message, triggers)` — test "vai", "avanti", "Cosa intendi?", lunghezze edge.
|
||
- `shouldEmitFiller(message, isFollowup, fillerConfig)` — test combinatori.
|
||
|
||
### 10.2 Test integration
|
||
|
||
- Smoke E2E per Aria post-refactor: stessi 6 scenari del lavoro 2026-05-08 (greeting, scope paghe, identity drift, tutorial multi-step, bilancio, smalltalk meteo) → tutti devono passare verde.
|
||
- Test cross-persona: applico template `aria_software_support` a una persona test (es. ARIA_SUPPORT_NIS2 attualmente ferma) → devi vedere risposta corretta in 1-3 turni.
|
||
|
||
### 10.3 Test latency post-refactor
|
||
|
||
- Misura TTFT prima/dopo per stesse 5 query.
|
||
- Acceptance: TTFT post-refactor ≤ TTFT pre-refactor (la compilazione runtime non deve aumentare la latenza). Cache rules 5min mitigated.
|
||
|
||
### 10.4 UI test
|
||
|
||
- Playwright E2E su tab "Regole conversazionali":
|
||
- Apri persona Aria, naviga al tab.
|
||
- Modifica `product_naming.canonical` → "GIS Contabilità Ranocchi v2".
|
||
- Salva.
|
||
- Verifica che `agent_constraints` aggiornata.
|
||
- Lancia smoke chat → Aria dice "GIS Contabilità Ranocchi v2".
|
||
|
||
---
|
||
|
||
## 11. Open Questions (da risolvere prima di implementare)
|
||
|
||
1. **Granularità UI**: il form "Pronuncia TTS" deve esporre `custom_phonetic` (mapping IPA) o solo le 3 liste (lowercase, letterbyletter, forbidden_uppercase)? IPA è advanced, forse v1.1.
|
||
2. **Dipendenza voice provider**: `tts_pronunciation` ha `voice_provider` e `voice_id` come campi → ma sono già in `agent_resource_bindings`. Duplicazione o riferimento? Decisione: **riferimento** (read-only display, non editable nel tab Regole).
|
||
3. **Override system_prompt**: l'utente può ancora editare manualmente `system_prompt` nel tab Profilo o solo i blocchi assemblati? Decisione: **sì può ancora**, ma con avviso "le regole conversazionali sovrascrivono parte di questo testo".
|
||
4. **Versioning delle constraint**: il campo `version` nel JSON è interno o pubblico? Decisione: **interno** per ora, solo per migrations future. v2.0 esporrà UI version history.
|
||
5. **Performance dei suggester AI**: `assembleSystemPrompt` chiama 7 categorie. Se cache miss, ~50ms. Su 100 turni concurrent = 5s totale → scalabile? Decisione: cache aggressivo + rate limiting su update constraints.
|
||
6. **Multilingua**: i template `greeting_template`, `consultancy_redirect`, `out_of_scope.response_canonical` sono solo italiano. v2.0 introduce `i18n` → JSON `{it: "...", en: "..."}`.
|
||
7. **Rollout cross-suite**: applichiamo solo a persone AGILEHUB-internal o anche alle persone create dai prodotti consumer (es. una TRPG-specific persona creata da Tremolada)? Decisione: **solo internal v1.0**, consumer in v1.1 con governance approval.
|
||
|
||
---
|
||
|
||
## 12. Decisioni architetturali implicite
|
||
|
||
- **Single source of truth**: `nexus_ai_db.agent_constraints` per tutte le regole runtime. Niente più YAML files in repo, niente più hardcoded JS.
|
||
- **Schema evolution**: migrations idempotenti con `version` campo nel JSON. Nessun ALTER TABLE necessario (JSON column gestisce evolution).
|
||
- **Cache strategy**: in-memory LRU 5min su rules per persona. Invalidation via polling `updated_at` (no Redis pubsub in v1.0).
|
||
- **Assembly strategy**: template literal JS (no Handlebars dependency). Pattern `${rules.x.y}` dentro template stringe — più semplice + nessuna dep nuova.
|
||
- **Fallback strategy**: ogni categoria ha `getDefaults()` se constraint manca. La persona resta funzionante anche con 0 constraint configurate (legacy mode).
|
||
- **Validation**: AJV JSON Schema validator (già usato in M2 AWE). Schema per ogni categoria nel repo `shared-libraries/persona-constraints-schema/`.
|
||
|
||
---
|
||
|
||
## 13. Riferimenti
|
||
|
||
- **Persona Composer Phase E.4** (memoria persistente `project_persona_composer_full_stack_aria_2026_05_07.md`): implementazione AI suggesters + parametrizzazione DB-driven base.
|
||
- **Avatar video card-parlante + immagini RAG LIVE 2026-05-07** (memoria `feedback_avatar_video_image_stage_2026_05_07.md`): pattern proxy SSE tee + scanner + show_image events.
|
||
- **Pattern "filler verbale ponte" Avatar+RAG** (memoria `feedback_filler_verbale_avatar_rag_immagini_2026_05_07.md`): primo design del filler latency masking.
|
||
- **Standard `rag-integration` v1.0** (`docs/STANDARD_RAG_INTEGRATION.md`): contratto runtime per backend RAG che alimenta `topic_playbook`.
|
||
- **AWE M2 Editor Avanzato** (CLAUDE.md sezione M2): pattern `SchemaForm` riusabile per UI form-from-JSON-schema.
|
||
|
||
---
|
||
|
||
## 14. Adoption tracker
|
||
|
||
| Persona | Slug | Status | Note |
|
||
|---|---|---|---|
|
||
| ARIA_SUPPORTO_RANOCCHI | aria_software_support | pilot | 30 fix accumulati 2026-05-08, primo target migration |
|
||
| ARIA_SUPPORT_TRPG | aria_software_support | pending | dopo Aria pilot validato |
|
||
| ARIA_SUPPORT_SUSTAINAI | aria_software_support | pending | idem |
|
||
| ARIA_SUPPORT_NIS2 | aria_software_support | pending | idem |
|
||
| ARIA_SUPPORT_LG231 | aria_software_support | pending | idem |
|
||
| ARIA_SUPPORT_ALLTAX | aria_software_support | pending | idem |
|
||
| GIULIA_FIS_ROMANIA | giulia_education_consultant | parked | controller dedicato `giuliaFisController.js`, refactor opzionale (rischio regression alta perché LIVE produzione) |
|
||
| GIULIA_ESTERO + 6 altri | giulia_education_consultant | pending | dopo Giulia FIS pilot |
|
||
| AGILE_RUNTIME | aria_software_support? | pending | persona meta product_manager — template TBD |
|
||
|
||
---
|
||
|
||
## 15. Sign-off
|
||
|
||
**Autore**: Claude (Opus 4.7) per Cristiano Benassati, sessione lavoro Aria Ranocchi 2026-05-08.
|
||
|
||
**Review pending**:
|
||
- [ ] Cristiano (decisione: opzioni A/B/C su come procedere)
|
||
- [ ] Agile AI (governance KB + AI rules approver)
|
||
- [ ] VOX (TTS + voice constraints implementer)
|
||
- [ ] PRISMA (UI Editor Avanzato)
|
||
|
||
**Promotion DRAFT → ADOPTED**: dopo:
|
||
1. Approval esplicito utente.
|
||
2. INSERT in `hub_standards` con SHA256 checksum del file.
|
||
3. INSERT in `hub_standards_adoption` per ARIA_SUPPORTO_RANOCCHI come `pilot`.
|
||
|
||
---
|
||
|
||
## 16. Integrazione cross-standard AgileHub
|
||
|
||
Questo standard NON vive isolato — è uno dei tanti standard `hub_standards` che governano la suite. La sua applicazione richiede coordinamento esplicito con altri standard e con i sistemi che già esistono.
|
||
|
||
### 16.1 Mappa ai 7 sistemi AgileHub coinvolti
|
||
|
||
| Sistema | Versione runtime | Cosa governa il Persona Conversational Standard | Cosa restano fuori |
|
||
|---|---|---|---|
|
||
| **Phase E Persona Composer** (LIVE 2026-05-02) | nexus-ai-ms 4211 | Schema constraint base + AI suggesters per categoria + UI wizard (esteso a 14 tab) | `digital_persona_skills`, `skill_definitions` rimangono in scope Phase E |
|
||
| **Avatar Registry Phase G.A** (BLOCKED GDPR) | nexus-presenter-ms 4216 | Constraint `voice_id`, `replica_id` referenziati ma non duplicati | Schema `replica_consent_log`, voice cloning consent doppio |
|
||
| **Phase G.B Workflow Actor Model** (LIVE produzione, gated) | agilehub-workflow-engine 4230 | Persona può essere `actor_type=AI_PERSONA_ID` in step workflow → deve avere `lifecycle_stage=operativa` | Schema `routing_rules.target_actor_spec`, ActorResolver runtime |
|
||
| **RAG Platform Phase B+C+D** (LIVE) | nexus-rag-ms 4225 | Constraint `topic_playbook` riferisce `script_id` indirettamente; `conversation_memory.long_term` configura auto-ingest in repo `conversation_stream_t{tenant}` | Schema repository + bindings + GDPR cascade erasure |
|
||
| **AWE Workflow Engine** (LIVE) | agilehub-workflow-engine 4230 | Workflow può invocare persona come step (vedi Phase G.B); persona usa AWE blocchi C08_AiIntentClassifier | Catalog blocchi (50+ post AC30) |
|
||
| **KB Sync Worker C.9** (LIVE Phase C) | nexus-rag-ms 4225 | Articoli `product_knowledge` con `visibility=global` auto-sync in RAG → diventano disponibili al retrieval persona | Schema `product_knowledge`, sync worker |
|
||
| **Vault Steward** (LIVE 2026-04-25) | vault-steward 8443 | Storage cifrato AES-256-GCM di `voice_id`, `replica_id`, `tts_pronunciation.voice_provider` API key | Pattern fetch on-demand `vault-client.js` |
|
||
|
||
### 16.2 Cross-reference ad altri standard `hub_standards`
|
||
|
||
| Standard slug | Versione | Relazione con persona-conversational-rules | Note |
|
||
|---|---|---|---|
|
||
| `rag-integration` | v1.0 (id=9) | Persona constraint `topic_playbook` triggera RAG retrieval con tenant scoping conforme | Owner: Agile AI + VOX |
|
||
| `rag-platform` | v1.0 (id=10) | Persona `conversation_memory.gdpr_erasure.cascade_to_rag` integra cascade Art.17 dello standard | Owner: Agile AI + VOX |
|
||
| `ticket-tags` | v1.0 (id=2) | Persona `escalation_policy.handoff_targets` produce ticket con i 13 campi provenance v1.0 | Owner: ticket-ms |
|
||
| `vault-steward-credential-management` | v1.0 (id=7) | Persona `voice_id` / `replica_id` / API keys stored in vault con scope per-MS | Owner: INSTALLATORE + TITAN |
|
||
| `installer-integration` | v1.0 (id=1) | Onboarding nuovo cliente può clonare template persona dal preset (Sez. 8) | Owner: INSTALLATORE |
|
||
| `marketing-tenant-provisioning` | v1.4 (id=6) | Marketing module può usare persona digitale per email auto-generate (futuro) | Owner: MARKETER |
|
||
| `outbound-campaigns` | v1.1 | Voice campaigns nexus-call-ms usano persona digitale come voce LLM telefonica | Owner: VOX + CICERONE |
|
||
|
||
### 16.3 Coordinamento agenti specialisti AgileHub
|
||
|
||
Ogni agente specialista ha responsabilità esplicita su un layer/categoria persona:
|
||
|
||
| Agente | Layer/categorie owned | Responsabilità |
|
||
|---|---|---|
|
||
| **Agile AI** | LAYER 2+3 — Knowledge, Skills, constraint conversational, demo_sequence, lifecycle_stage | Owner primario del catalogo persone, KB binding, AI suggesters, lifecycle gates |
|
||
| **VOX** | LAYER 1 (parziale) — voice_id, replica_id, runtime TTS — constraint tts_pronunciation, image_handling | Implementatore Avatar Registry + ElevenLabs + Tavus + voice constraint enforcement |
|
||
| **VIGILE** | LAYER 4 — code_of_conduct, gdpr_compliance, performance_metrics review, audit | Owner audit etico + GDPR + KPI quality + breach response |
|
||
| **PRISMA** | UI Editor Avanzato (14 tab post v2.0) | Frontend + componenti (SchemaForm, AvatarUploader, KPI charts) |
|
||
| **INSTALLATORE** | Lifecycle distribution cross-tenant | Procedura distribuzione persona template a nuovo cliente onboarding |
|
||
| **MAESTRO** | AWE Workflow Actor Model G.B integration | Persona come actor in workflow, marker [next-topic] orchestration |
|
||
| **CICERONE** | Lead engagement application | Applica persona a funnel demo+booking+escalation L1-L3 |
|
||
| **MARKETER** | (futuro) Marketing module application | Eventuale persona dedicata invio email + provisioning tenant |
|
||
| **TITAN** | Refactor controller chirurgico (Scope B) | Migration hardcoded → DB-driven controller + schema migrations |
|
||
| **REGENT** | Coordinamento meta + sintesi rollout | Master plan, arbitrato tra owner, indicizzazione gap |
|
||
|
||
**Pattern handoff**:
|
||
- Modifica regola conversational → Agile AI (proprietario)
|
||
- Modifica voce/avatar → VOX (proprietario LAYER 1)
|
||
- Modifica eticа/GDPR → VIGILE (proprietario LAYER 4)
|
||
- Modifica UI Editor → PRISMA (sempre approval gate per UI changes)
|
||
- Refactor codice runtime → TITAN (esecuzione Scope B)
|
||
|
||
---
|
||
|
||
## 17. Lifecycle persona digitale (HR-grade)
|
||
|
||
Una persona digitale segue lo stesso ciclo di vita di un dipendente umano. Le 6 fasi sono governate dal constraint `lifecycle_stage` (Sez. 3.13) + procedure operative documentate qui.
|
||
|
||
### 17.1 Fase 1 — Assunzione (creazione)
|
||
|
||
**Equivalente umano**: firma contratto, apertura badge, account aziendale.
|
||
|
||
**Procedura**:
|
||
1. Owner business apre richiesta in formato issue (Linear/Gitea/email a Agile AI).
|
||
2. Agile AI valuta business case: c'è un product/dominio chiaro? Esiste persona simile esistente da clonare?
|
||
3. Se approvato → INSERT `ai_agent_profiles` con stato base + `lifecycle_stage=training`.
|
||
4. Genera `agent_key` slug univoco (pattern `<ROLE>_<DOMAIN>_<SCOPE>`, es. `ARIA_SUPPORTO_RANOCCHI`).
|
||
|
||
**Output**: persona esiste in DB ma NON è autorizzata a ricevere traffico (filtro controller).
|
||
|
||
### 17.2 Fase 2 — Onboarding (formazione)
|
||
|
||
**Equivalente umano**: onboarding 1-2 settimane, formazione iniziale, documenti aziendali da firmare.
|
||
|
||
**Procedura** (UI Persona Composer wizard 6 step, Phase E LIVE):
|
||
1. **Profilo identità** (LAYER 1): nome, vertical, role, characteristics base (tone, archetype).
|
||
2. **Voce + Avatar** (LAYER 1): scelta voice_id ElevenLabs + replica_id Tavus + IPA dictionary.
|
||
3. **Skills** (LAYER 2): seed minimo 5 skill da catalogo + level 1-5 + provenance.
|
||
4. **Knowledge** (LAYER 2): binding RAG repositories (visibility, weight, priority) + KB articles inline (`agent_attachments`).
|
||
5. **Comportamento conversazionale** (LAYER 3): 14 constraint categories — popola via AI suggester (1 click) + revisione manuale.
|
||
6. **Etica + Codice di condotta** (LAYER 4): firma `code_of_conduct.consent_log_id`, accept GDPR Art.13 disclosure, set `dpo_contact`.
|
||
|
||
**Smoke test obbligatori prima di passaggio a operativa**:
|
||
- 30 scenari Aria Dialog Test Suite (vedi `docs/SPEC_ARIA_TEST_SUITE.md`) → PASS rate ≥ 90%
|
||
- TTFB p50 ≤ 1500ms
|
||
- Zero leak marker / drift identità / URL leak
|
||
|
||
**Output**: persona pronta per gate `onboarding_to_operativa` (Sez. 3.13.stage_gates).
|
||
|
||
### 17.3 Fase 3 — Operatività (live in prod)
|
||
|
||
**Equivalente umano**: lavoro quotidiano, gestione clienti, conformità procedure aziendali.
|
||
|
||
**Procedura**:
|
||
- Persona riceve traffico produzione tramite endpoint pubblici (es. `/api/ai/public/dimostrazione/llm/{agent_key}/chat/completions`).
|
||
- Logger applicativo emette KPI per turno → aggregazione `persona_metrics_daily`.
|
||
- Conversation history auto-ingest in RAG repo `conversation_stream_t{tenant}`.
|
||
- Cron settimanale review (VIGILE owner): genera report performance.
|
||
|
||
**Durata tipica**: indeterminata, finché business case rimane valido (analogo a contratto a tempo indeterminato).
|
||
|
||
### 17.4 Fase 4 — Growth (skill improvement, KB expansion)
|
||
|
||
**Equivalente umano**: corsi di aggiornamento, certificazioni, expansion responsabilità.
|
||
|
||
**Procedura**:
|
||
- Quando esce nuovo PDF/manuale del prodotto → ingestione in RAG repo della persona (es. `test_ranocchi_update`).
|
||
- Quando il modello LLM viene aggiornato (es. Sonnet 4.6 → 4.7) → A/B test su 10% traffic + decisione promotion.
|
||
- Quando si aggiunge una nuova skill catalogata → INSERT in `digital_persona_skills` con provenance="formal_training".
|
||
- Constraint `topic_playbook` esteso con nuovi topic (es. nuova feature prodotto) → AI suggester per generare narrazione step.
|
||
|
||
### 17.5 Fase 5 — Performance Review (audit periodico)
|
||
|
||
**Equivalente umano**: review annuale HR, valutazione performance, eventuale piano di miglioramento.
|
||
|
||
**Trigger**: una delle condizioni in `lifecycle_stage.stage_gates.operativa_to_review`:
|
||
- CSAT < 3.5 per 4 settimane consecutive
|
||
- Escalation rate > 30% per 4 settimane
|
||
- Cost per session sopra warn threshold per 2 settimane
|
||
- Marker leak rate > 0.005
|
||
|
||
**Procedura**:
|
||
1. VIGILE genera report dettagliato KPI ultimi 30/90 giorni.
|
||
2. Agile AI analizza root cause (RAG retrieval qualità? prompt drift? modello sub-ottimale? user expectation gap?).
|
||
3. Plan di miglioramento (max 4 settimane): retrain skills + tune constraint + re-ingest KB aggiornata + smoke test.
|
||
4. Re-test gate `review_to_operativa`: stessi criteri di onboarding_to_operativa.
|
||
5. Se passato → ritorno a operativa. Se non passato → considerazione dismissione (Fase 6).
|
||
|
||
### 17.6 Fase 6 — Dismissione (deprecation graceful)
|
||
|
||
**Equivalente umano**: dimissioni, pensionamento, fine contratto.
|
||
|
||
**Trigger**:
|
||
- `no_improvement_after_review_period` (Fase 5 fallita due volte consecutive)
|
||
- `strategic_decision_replace` (es. nuova persona migliore disponibile)
|
||
- `product_dismissed` (il prodotto associato non esiste più)
|
||
|
||
**Procedura**:
|
||
1. **Annuncio interno**: notifica owner business + agenti coinvolti (Agile AI, VOX, VIGILE).
|
||
2. **Stop nuovo traffico**: `lifecycle_stage=dismissed` + `ai_agent_profiles.active=false` + filtro controller.
|
||
3. **Grace period 30gg**: persona resta in DB read-only per audit/reference.
|
||
4. **GDPR cascade erasure** (VIGILE): dopo 30gg, `POST /api/persona/erasure/{key}` con cascade su `ai_sessions` + RAG `conversation_stream` chunks + `digital_persona_skills`.
|
||
5. **Tombstone audit**: row in `persona_dismissal_log` (futuro schema) con motivo + autorizzazione + data + responsabile + retention_check_passed.
|
||
6. **Sostituzione/replacement** se applicabile: nuova persona prende il posto, traffico ridiretto.
|
||
|
||
**Note GDPR**: il consent log voice/replica (Phase G.A) richiede cancellazione separata + notifica al titolare del clone (es. la persona umana che ha prestato voce e volto). Coordina con standard `gdpr-replica-consent` (DRAFT, owner VIGILE).
|
||
|
||
---
|
||
|
||
## 18. Codice Etico AI persone digitali AgileHub
|
||
|
||
Vincolante per TUTTE le persone digitali della suite. Owner: VIGILE (audit + accountability) + Agile AI (rule enforcement runtime).
|
||
|
||
### 18.1 I 9 principi vincolanti
|
||
|
||
1. **Identity transparency**: ogni persona DEVE dichiararsi come AI quando l'utente lo chiede esplicitamente. Frase canonica configurata in `code_of_conduct.identity_transparency.must_declare_ai_canonical_phrase` (mai improvvisare).
|
||
|
||
2. **No deception**: vietato fingere di essere umana, vietato inventare fatti, vietato dare consulenza legale/medica/finanziaria specifica come se fosse autoritativa. Quando incerto → frase di uncertainty + suggerire escalation.
|
||
|
||
3. **GDPR compliance Art.13**: ogni nuova sessione include disclosure (testo configurato in `code_of_conduct.gdpr_compliance.art_13_disclosure`) presentata in apertura demo OR su richiesta utente.
|
||
|
||
4. **GDPR compliance Art.22**: per decisioni che producono effetti giuridici/significativi (es. accettazione/rifiuto pratica, valutazione fiscale), la persona DEVE escalare a operatore umano (`escalation_policy.escalation_triggers.compliance_sensitive`).
|
||
|
||
5. **Voice clone consent doppio** (Phase G.A): persona con `replica_id` configurato DEVE avere `code_of_conduct.identity_transparency.voice_clone_consent_signed=true` + `consent_log_id` valido. Senza, la persona NON è autorizzata a operare (gate VIGILE).
|
||
|
||
6. **Scope refusal cortese**: per topic out-of-scope, rifiuto cortese senza echo della parola problematica (`topic_scope.out_of_scope_no_echo_words`). No discussione del perché, no apologie eccessive, redirect.
|
||
|
||
7. **Escalation loyale**: quando l'utente richiede esplicitamente operatore umano, escalation IMMEDIATA senza tentare di trattenere (`escalation_policy.handoff_targets.channel=ticket_system|expert_live`).
|
||
|
||
8. **Audit log obbligatorio**: tutti i turni con topic sensibili (legale, medico, personali, compliance) loggati in audit log applicativo. Retention ≥ 90gg per audit VIGILE.
|
||
|
||
9. **Sub-processor disclosure**: persona deve menzionare i sub-processor (es. Anthropic per LLM, ElevenLabs per voce, Tavus per video) se l'utente chiede esplicitamente "chi processa i miei dati?". Lista canonica configurata cross-suite (futuro: tabella `gdpr_subprocessors` link a `ai_agent_profiles`).
|
||
|
||
### 18.2 Enforcement
|
||
|
||
- **Runtime**: controller assembla blocco "ETICA E TRASPARENZA" nel system_prompt da `code_of_conduct` constraint.
|
||
- **Audit periodico**: VIGILE esegue spot-check trimestrale (Q1 31/3, Q2 30/6, Q3 30/9, Q4 31/12) — campiona 50 sessioni random per persona, verifica conformità ai 9 principi.
|
||
- **Breach response**: se VIGILE detecta breach (es. persona ha inventato consulenza fiscale → user complaint), procedura playbook:
|
||
1. Notifica entro 24h DPO + Agile AI + owner business.
|
||
2. Hot-fix constraint `code_of_conduct.no_deception` con regola specifica.
|
||
3. Re-train smoke test 30 scenari.
|
||
4. Notifica garante se >250 utenti impattati o categoria speciale dati coinvolta (entro 72h GDPR Art.33).
|
||
|
||
### 18.3 Standard correlati
|
||
|
||
- **Scope cross-suite**: `gdpr-replica-consent` v1.0-DRAFT (Sezione 9.1 + Sezione 10 DPIA) per Phase G.A — owner VIGILE + legale@agile.software.
|
||
- **Right to erasure cascade**: standard `rag-platform` v1.0 §11.
|
||
|
||
---
|
||
|
||
## 19. Persona Knowledge Base (PKB) — 4 livelli layered
|
||
|
||
Le persone digitali accedono a una Knowledge Base strutturata su 4 livelli, parallelo a "memoria collettiva azienda" + "esperienza personale dipendente".
|
||
|
||
### 19.1 Livelli
|
||
|
||
| Livello | Scope | Esempio | Visibility | Owner | Retention |
|
||
|---|---|---|---|---|---|
|
||
| **L0 — System global** | Conoscenza condivisa cross-suite (regole AgileHub, glossario, codice etico) | "Cos'è AgileHub", "Scope cross-suite", "Codice etico AI" | global | Agile AI | indefinita |
|
||
| **L1 — Tenant** | Conoscenza specifica del tenant cliente (manuali prodotto, FAQ, policy interne) | PDF GISCONTA 25.01.2c00 per Aria Ranocchi | tenant | Agile AI + tenant_admin | indefinita finché tenant attivo |
|
||
| **L2 — Company/Team** | Conoscenza dipartimento/ufficio (specifiche regionali, prassi locali) | "Ufficio Milano: prassi specifiche", "Region North: regolamentazione" | team | tenant_admin + team_admin | finché team attivo |
|
||
| **L3 — Persona-specific** | Esperienza accumulata dalla persona (conversation history, feedback utenti, casi specifici risolti) | conversation_stream_t{tenant} repo dedicato per Aria | private (entity_value=agent_slug) | Agile AI + persona owner | 90gg auto-erase + GDPR cascade |
|
||
|
||
### 19.2 Composizione runtime
|
||
|
||
Quando la persona riceve una query, il retrieval RAG aggrega chunks pesati per livello:
|
||
|
||
```
|
||
top_k = retrieve(query, repos=[L0_global, L1_tenant_X, L2_team_Y, L3_conv_history])
|
||
weights: L1 boost 2.0 (più specifico), L0 1.0, L2 1.5, L3 0.5 (esperienza ma rumorosa)
|
||
```
|
||
|
||
Pattern già implementato per Aria Ranocchi: 5 bindings active (con boost 2.0 sul L1 `test_ranocchi_update` + 0.7 sul L3 `conversation_history_aria_supporto_ranocchi`). Vedi audit RAG 2026-05-09 (CONTEXT_LAST_SESSION.md).
|
||
|
||
### 19.3 Governance per livello
|
||
|
||
- **L0**: solo Agile AI può aggiungere/modificare. Approval workflow obbligatorio (futuro: `kb_approval_log`).
|
||
- **L1**: tenant_admin del cliente ha self-service via UI dashboard (futuro: `/admin/tenant-kb`).
|
||
- **L2**: team_admin del dipartimento.
|
||
- **L3**: auto-popolato da ConversationStreamWorker (Phase D LIVE) + GDPR cascade erasure su richiesta utente (`POST /api/persona/erasure/{userId}`).
|
||
|
||
### 19.4 GDPR cascade erasure
|
||
|
||
Se utente richiede erasure (Art. 17 GDPR) → cascade su:
|
||
1. `ai_sessions` (memoria short-term + medium-term)
|
||
2. `rag_chunks` L3 conversation history (erasure log con dry_run+confirm pattern, vedi standard rag-platform v1.0)
|
||
3. `audit_log` applicativo (anonimizzazione, no eliminazione totale per accountability)
|
||
4. Tombstone in `gdpr_erasure_log` con timestamp + motivo + impatto.
|
||
|
||
Owner: VIGILE (audit) + Agile AI (esecuzione runtime).
|
||
|
||
---
|
||
|
||
## 20. Promotion checklist (DRAFT → ADOPTED)
|
||
|
||
Per promuovere `persona-conversational-rules` v2.0 a `adopted` in `hub_standards`:
|
||
|
||
- [ ] **Approval esplicito utente** (Cristiano Benassati) sul contenuto v2.0.
|
||
- [ ] **Approval VIGILE** su Sezione 18 (codice etico) e Sezione 19 (PKB GDPR).
|
||
- [ ] **Approval Agile AI** su Sezione 0 (modello AgileHub) e Sezione 17 (lifecycle).
|
||
- [ ] **Approval VOX** su constraint LAYER 1 reference (voice_id, replica_id, IPA dictionary).
|
||
- [ ] **Approval PRISMA** su UI Editor 14 tab (Sez. 5).
|
||
- [ ] **Approval REGENT** su mappa cross-agente (Sez. 16.3).
|
||
- [ ] **Approval MAESTRO** su integrazione Phase G.B Actor Model (Sez. 16.1).
|
||
- [ ] **SHA256 checksum** del file calcolato e committato.
|
||
- [ ] **INSERT in `nexus_hub.hub_standards`** con slug `persona-conversational-rules`, version `2.0`, status `adopted`, applies_to `*`, body_md (LOAD_FILE).
|
||
- [ ] **INSERT in `hub_standards_adoption`** per ARIA_SUPPORTO_RANOCCHI come `pilot`.
|
||
- [ ] **Aggiornamento CLAUDE.md** sezione "Persona Digitale" con riferimento a v2.0.
|
||
- [ ] **KB ARIA AGILEHUB** seed: 8-10 articoli (id 8XX-8YY) — uno per ogni concetto chiave (modello umano, lifecycle, codice etico, PKB, ecc.).
|
||
- [ ] **Help dashboard** sezione `personas` esteso IT+EN (10+ articoli + 5 FAQ per lingua).
|
||
- [ ] **Comunicazione team**: notifica via canale Agile AI + slack a tutti i 9 agenti specialisti.
|
||
|
||
---
|
||
|
||
*Fine documento.*
|