# Spec F2-A+B: Agents Configurables i Paràmetres de Simulació **Data:** 2026-05-03 **Fases:** F2-A i F2-B del roadmap enterprise (2026-04-26-enterprise-roadmap.md) **Estat:** Aprovat per disseny --- ## Context La Fase 2 del roadmap enterprise té com a objectiu un flux iteratiu: construir graf → ajustar agents → simular → ajustar → re-simular. Fins ara el Step 2 és un pas únic i automàtic: genera perfils d'agents i config de simulació sense pauses ni possibilitat d'edició. L'usuari ha de reconstruir tot el projecte si vol ajustar qualsevol cosa. Aquesta spec cobreix: 1. **Redisseny del flux Step 2** en tres fases amb confirmació explícita 2. **Selector de nombre d'agents** — top-N per connectivitat 3. **Edició, regeneració, creació i eliminació d'agents individuals** (Fase A) 4. **Edició de paràmetres de comportament i simulació** (Fase B) 5. **Clonació de simulació** — reutilitzar agents i config d'una simulació anterior 6. **Aïllament de grafs per simulació** — cada simulació té el seu propi `group_id` Neo4j --- ## Redisseny del flux Step 2 El Step 2 passa de ser un pas únic a tenir tres fases seqüencials: ``` FASE A — Generació i edició de personalitats El sistema genera els perfils d'agents (nom, bio, persona, mbti, etc.) L'usuari pot retocar, regenerar, crear o eliminar agents. → L'usuari prem "Continuar" quan està satisfet FASE B — Generació i edició de config de comportament El sistema genera la config de comportament dels agents restants (posts_per_hour, active_hours, etc.) i els paràmetres globals de simulació (total_simulation_hours, pesos de plataforma, etc.). L'usuari pot editar qualsevol d'aquests paràmetres. → L'usuari prem "Iniciar simulació" per passar al Step 3 FASE C — Step 3: Llançament (sense canvis respecte a l'actual) ``` **Camps editables per fase:** - **Fase A** (per agent): `name`, `bio`, `persona`, `age`, `gender`, `mbti`, `country`, `profession`, `interested_topics`, `stance`, `sentiment_bias` - **Fase B** (per agent): `posts_per_hour`, `comments_per_hour`, `active_hours`, `response_delay_min`, `response_delay_max`, `activity_level`, `influence_weight` - **Fase B** (globals simulació): `total_simulation_hours`, `minutes_per_round`, `agents_per_hour_min`, `agents_per_hour_max`, `following_probability`, `recsys_type`, `recency_weight`, `popularity_weight`, `relevance_weight`, `viral_threshold`, `echo_chamber_strength` --- ## Model de dades ### Nou estat de simulació: `profiles_ready` El cicle d'estats s'amplia: ``` created → preparing → profiles_ready → configuring → prepared → running → completed → stopped → failed ``` - `profiles_ready`: perfils d'agents generats, esperant confirmació de l'usuari per generar config - `configuring`: generant config de comportament i simulació (async) - `prepared`: config generada, llest per llançar (estat actual) ### Canvi a la BD: `parent_simulation_id` ```sql ALTER TABLE simulations ADD COLUMN parent_simulation_id VARCHAR(64) REFERENCES simulations(simulation_id); ``` - `NULL` → simulació nova - Valor → simulació clonada d'una existent ### Canvi a la BD: `graph_id_simulation` ```sql ALTER TABLE simulations ADD COLUMN graph_id_simulation VARCHAR(128); ``` Conté el `group_id` Neo4j exclusiu d'aquesta simulació. `NULL` fins que s'inicia. ### Immutabilitat - `status IN ('completed', 'running')` → no es pot editar - `status IN ('created', 'preparing', 'profiles_ready', 'configuring', 'prepared', 'stopped', 'failed')` → editable ### Flag de protecció contra sobreescriptura Cada agent porta `manually_edited: bool` (default `False`) a `reddit_profiles.json` i `simulation_config.json`. El generador en batch salta els agents amb `manually_edited: True`. --- ## Subsistema 1: Selector de nombre d'agents (pre-generació) ### Comportament Abans d'iniciar la Fase A, el sistema consulta quantes entitats hi ha disponibles al graf i mostra el total com a suggeriment. L'usuari pot reduir el número. Si no toca res, el comportament és idèntic a l'actual (es generen tots). Si l'usuari redueix a N, el backend selecciona les **top-N entitats per grau de connectivitat** (edges entrants + sortints). Les entitats més connectades generen simulacions socialment més riques. **Mínim recomanat:** 15 agents. El frontend mostra un avís si el valor és inferior. ### Canvis al backend `POST /api/simulation/prepare` — nou paràmetre opcional `max_agents: int`. Nova funció: `ZepEntityReader.get_entities_by_connectivity(graph_id, max_n)` — obté totes les entitats, les ordena per nombre d'edges i retorna les top-N. ### Canvis al frontend (Step 2) Just abans d'iniciar la generació: - `GET /api/simulation/entities/{graph_id}` per obtenir el total disponible - Camp numèric amb valor default = total disponible - Avís visual si valor < 15 - Desplegable "Nova simulació / Des de simulació anterior" (vegeu Subsistema 5) - El valor es passa a `POST /api/simulation/prepare` com a `max_agents` --- ## Subsistema 2: Fase A — Edició de personalitats d'agents ### Comportament La Fase A comença quan el primer agent és generat. L'usuari veu les cards d'agents aparèixer progressivament. En completar-se la generació, apareix el botó "Continuar →" que activa la Fase B. Mentre la generació és en curs o un cop completada, l'usuari pot: - **Editar** qualsevol agent ja generat - **Regenerar** un agent (un cop la generació completa, `status: profiles_ready`) - **Crear** un agent nou basat en una entitat del graf - **Eliminar** un agent ### 2a. Edició d'un agent **Backend:** `PATCH /api/simulation/{sim_id}/agent/{user_id}` ```json { "bio": "...", "stance": "opposing" } ``` Acció: 1. Valida `status NOT IN ('running', 'completed')` 2. Carrega `reddit_profiles.json` 3. Localitza l'agent per `user_id`, aplica canvis + `manually_edited: True` 4. Desa atòmicament (backup → escriptura → elimina backup si OK, restaura si falla) 5. Retorna el perfil actualitzat **Frontend:** modal d'agent existent amb botó "Editar" que activa mode edició. Camps editables de Fase A com `` / `