# Tipos: AgentAction / RoundSummary / RunnerStatus

Fuente conceptual: MiroFish `backend/app/services/simulation_runner.py` (AGPL-3.0)
Reimplementar desde cero. No copiar codigo.

## Tipos a implementar

### 1. RunnerStatus (enum/sum)

- **Dominio:** core
- **Lang:** Python
- **Algebraic:** sum
- **Definicion:**
  ```python
  class RunnerStatus(str, Enum):
      IDLE = "idle"
      STARTING = "starting"
      RUNNING = "running"
      PAUSED = "paused"
      STOPPING = "stopping"
      STOPPED = "stopped"
      COMPLETED = "completed"
      FAILED = "failed"
  ```
- **Descripcion:** Maquina de estados para un runner de simulacion o pipeline de larga duracion. Transiciones validas:
  - IDLE → STARTING → RUNNING
  - RUNNING → PAUSED → RUNNING (resume)
  - RUNNING → STOPPING → STOPPED
  - RUNNING → COMPLETED
  - RUNNING → FAILED
  - STARTING → FAILED

### 2. AgentAction (product)

- **Dominio:** core
- **Lang:** Python
- **Algebraic:** product
- **Definicion:**
  ```python
  @dataclass
  class AgentAction:
      round_num: int                  # ronda de la simulacion
      timestamp: str                  # ISO timestamp
      platform: str                   # "twitter" | "reddit" | custom
      agent_id: int                   # ID del agente
      agent_name: str                 # nombre del agente
      action_type: str                # "CREATE_POST", "LIKE_POST", "COMMENT", etc.
      action_args: dict = field(default_factory=dict)  # parametros de la accion
      result: str | None = None       # resultado de la accion
      success: bool = True            # si la accion fue exitosa
  ```
- **Metodos:** `to_dict() -> dict`
- **Descripcion:** Registro de una accion individual de un agente en una simulacion multi-agente. Captura que hizo, cuando, en que plataforma, y si fue exitoso.

### 3. RoundSummary (product)

- **Dominio:** core
- **Lang:** Python
- **Algebraic:** product
- **Definicion:**
  ```python
  @dataclass
  class RoundSummary:
      round_num: int
      start_time: str
      end_time: str | None = None
      simulated_hour: float = 0.0
      actions: list[AgentAction] = field(default_factory=list)
      active_agents: int = 0
  ```
- **Metodos:** `to_dict() -> dict`
- **Descripcion:** Resumen de una ronda de simulacion. Agrupa las acciones de todos los agentes en esa ronda con tiempos y conteos.
- **Uso:** Permite replay de simulaciones ronda por ronda, visualizacion de timeline, y analisis post-simulacion.
