# Spec F2-A: Edició, Regeneració, Creació i Clonació d'Agents **Data:** 2026-05-03 **Fase:** Fase 2-A 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, MiroFish genera N agents a partir del graf de forma automàtica i no permet modificar-los ni reutilitzar-los entre simulacions. L'usuari ha de reconstruir tot el projecte si vol ajustar qualsevol cosa. Aquesta spec cobreix: 1. **Selector de nombre d'agents** — triar top-N per connectivitat abans de generar 2. **Edició d'agents individuals** — editar camps LLM-generats d'un agent concret 3. **Regeneració, creació i eliminació d'agents individuals** — regenerar un agent, crear-ne un de nou basat en una entitat del graf, o eliminar-ne un 4. **Clonació de simulació** — crear una nova simulació dins el mateix projecte partint dels agents i config d'una simulació anterior 5. **Aïllament de grafs per simulació** (ex F2-D) — cada simulació escriu les converses al seu propi `group_id` Neo4j via clonatge APOC --- ## Model de dades ### Canvi a la BD: `parent_simulation_id` Afegir una columna nullable a la taula `simulations`: ```sql ALTER TABLE simulations ADD COLUMN parent_simulation_id VARCHAR(64) REFERENCES simulations(simulation_id); ``` - `NULL` → simulació nova (comportament actual) - Valor → simulació clonada d'una existent No hi ha canvis a cap altra taula ni model existent. ### Canvi a la BD: `graph_id_simulation` Afegir una columna nullable a la taula `simulations`: ```sql ALTER TABLE simulations ADD COLUMN graph_id_simulation VARCHAR(128); ``` Conté el `group_id` Neo4j exclusiu d'aquesta simulació (creat per clonatge APOC just abans de llançar). `NULL` fins que la simulació s'inicia. ### Immutabilitat de simulacions completades - `status IN ('completed', 'running')` → no es pot editar - `status IN ('created', 'prepared', 'stopped', 'failed')` → editable ### Camps editables d'un perfil d'agent Editables (LLM-generats): `name`, `bio`, `persona`, `age`, `gender`, `mbti`, `country`, `profession`, `interested_topics`, `stance`, `sentiment_bias`, `activity_level`. Immutables (OASIS els necessita intactes): `user_id`, `source_entity_uuid`, `source_entity_type`. ### Flag de protecció contra sobreescriptura Cada agent porta un flag `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 del botó "Generar agents" al Step 2, el sistema consulta quantes entitats hi ha disponibles al graf i mostra el total com a suggeriment (ex: "66 agents disponibles"). L'usuari pot reduir el número. Si no toca res, el comportament és idèntic a l'actual. Si l'usuari redueix a N, el backend selecciona les **top-N entitats per grau de connectivitat** (edges entrants + sortints al graf Zep). Les entitats més connectades representen els actors amb més relacions al document i 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: ```json { "max_agents": 40 } ``` Si `max_agents` és present, `ZepEntityReader` ordena les entitats filtrades per grau de connectivitat descendent i agafa les primeres N. Nova funció: `ZepEntityReader.get_entities_by_connectivity(graph_id, max_n)` — obté totes les entitats, les ordena per `len(edges)` i retorna les top-N. ### Canvis al frontend (Step 2) Just abans del botó "Generar agents": - Crida a `GET /api/simulation/entities/{graph_id}` (ja existent) per obtenir el total - Camp numèric amb valor default = total disponible - Avís visual si valor < 15 - El valor es passa a `POST /api/simulation/prepare` com a `max_agents` --- ## Subsistema 2: Edició d'agents individuals ### Comportament El modal de visualització d'agents (ja existent a `Step2EnvSetup.vue`) afegeix un botó "Editar" que converteix els camps en inputs editables. En desar, el backend actualitza el perfil i marca `manually_edited: True`. L'edició és possible durant la generació (l'agent editat queda protegit) i després de la generació completa. No és possible si `status: running` o `completed`. ### Canvis al backend `PATCH /api/simulation/{sim_id}/agent/{user_id}` ```json { "bio": "...", "stance": "opposing" } ``` Acció: 1. Valida que la simulació no és `running` ni `completed` 2. Carrega `reddit_profiles.json` i `simulation_config.json` 3. Localitza l'agent per `user_id` 4. Aplica els canvis + `manually_edited: True` 5. Desa atòmicament (backup → escriptura → elimina backup si OK, restaura si falla) 6. Retorna el perfil actualitzat ### Canvis al frontend (Step 2) Al modal d'agent (`Step2EnvSetup.vue`): - Botó "Editar" → converteix camps en `` / `