# 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 `` / `