API — syv-character-kit
Fuente de Verdad del Contrato HTTP
Cualquier mención a rutas en PRD.md,
docs/*, mocks o código se resuelve contra este archivo. Si una ruta no figura acá, no existe en el contrato.Convenciones de payload: ver docs/hoja-modelo.md y docs/tag-modelo.md. Idioma: castellano rioplatense.
Convención GET /meta/{categoria} — catálogo de tag
Cualquier GET /meta/{categoria} devuelve el catálogo canon de esa categoría de tag. La estructura de cada entrada es la definida en docs/tag-modelo.yaml. La lista de categorías curadas (skill, trait, perk, rasgo, equipo.arma, equipo.utilitario, equipo.vestidura, rol.*, etc.) vive en docs/tag-modelo.md §3.
Categorías nuevas se exponen automáticamente bajo /meta/{categoria} el día que existen — no requieren entry en este archivo. Para sub-categorías: GET /meta/equipo/arma, GET /meta/rol/oficio, etc.
Las sub-categorías se exponen con barras (/meta/equipo/arma), no con punto. La notación punto (equipo.arma) es solo del tag interno.
Mapea: UC-09.
Casos que NO siguen la convención (porque el payload difiere o agregan datos derivados):
GET /meta/factions— facciones con descriptor de lore corto.GET /meta/rangos— rangos con tabla determinística de stats,mandodefault y rol cultural por facción. Tabla canónica en gddr/01-flujo-obligatorio-creacion.md §3.GET /meta/hito_types— enum sugerido de tipos de hito (catálogo abierto; lista en docs/hoja-modelo.md §5).GET /meta/encuentro/new— devuelve una patente opaca de encuentro lista para usarse enescuadra.miembros[].iniciativa.encuentro. No es un catálogo: es un generador. Ver GDDR-02 §1.7 para el modelo de la entidad implícita.
Personajes
GET /character
Genera un personaje efímero. Parámetros opcionales: faccion, rango, seed, fields, tag. fields recibe dot-paths separados por coma: fields=identidad.slug,atributos.fis.
tagadmite repetición para filtrado en AND lógico (?tag=skill.tirador_designado&tag=rol.lider). El valor debe ser un tag completo en notación punto. OR no está soportado en v1 — el cliente lo resuelve con N calls + unión.- Aplica al sorteo: el efímero generado debe portar todos los tags exigidos. Si la combinación es inviable, devuelve 409.
Devuelve un personaje con identidad.slug: null (los efímeros no tienen slug hasta canonizarse), historial: [], aliados: [], nemesis: [], metadatos.canonizado_en: null, y los tags mínimos estado.disponible + escuadra.* correspondiente.
Mapea: UC-01..04, UC-06, UC-16, UC-19, UC-20, UC-22.
GET /character/{slug}
Devuelve la ficha vigente del personaje con identidad.slug exacto. 404 si no existe. Acepta fields= (dot-paths CSV, ej. fields=identidad.slug,identidad.nombre,atributos.fis) para podar. Incluye los campos derivados (filiacion, fatiga_max, moral_max, fza_aportada) definidos en MODEL.md §1.
Mapea: UC-05, UC-15, UC-16.
GET /character/{slug}/historial
Devuelve solo historial[]. Sin paginación en v1.
Mapea: UC-17.
POST /character/{slug}/event
Registra un hito. Body: una entrada de historial[] (estructura en docs/hoja-modelo.md §5). Apendea, aplica efecto sobre campos vigentes, actualiza metadatos.ultima_actualizacion, devuelve ficha actualizada. 409 sobre mocks; 404 sobre efímeros.
Mapea: UC-10..14, UC-18.
POST /canonize
Persiste un personaje generado como canon. Asigna identidad.slug (patente [A-Z0-9]{8} generada del lado servidor), congela historia, fija metadatos.canonizado_en. Idempotente por (seed, faccion, rango).
Mapea: UC-07.
GET /roster/mock
Lista los 22 fixtures con slug, nombre, sobrenombre, y los tags faccion.*, rango.*, rol.* correspondientes. Sin payload completo.
Mapea: UC-08.
Escuadras
GET /escuadras
Lista todas las escuadras persistidas. Acepta parámetro opcional faccion para filtrar.
GET /escuadras/{slug}
Devuelve la ficha detallada de la escuadra con el slug exacto. Incluye todos los campos de identidad (incluyendo tipo), la lista de miembros[] (con sus puntos), la lista historial[] de hitos, y los campos calculados dinámicamente (fza_total, cohesion_vigente, moral_promedio, fatiga_promedio, movimiento_tactico, puntos_totales, lider_vigente, estado_escuadra, cumple_template, errores_validacion[]).
Mapea: UC-24.
POST /escuadras
Crea y persiste una nueva escuadra. El body debe incluir la estructura de identidad (incluyendo tipo) y opcionalmente una lista inicial de miembros e historial.
Mapea: UC-25.
POST /escuadras/{slug}/miembro
Añade un personaje como miembro de la escuadra.
- Body:
{ "ref": "PATENTE", "pos": int, "puntos": int, "aspectos"?: list[str] }.aspectoses opcional; default[]. - Efecto colateral: Añade la patente, posición (
pos), costo en puntos (puntos), rango, nombre yaspectos[]a la listamiembros[]de la escuadra, añade los tagsescuadra.{slug}andlealtad.escuadra.{slug}a la hoja del personaje, y registra un hitoasignacion_escuadratanto en elhistorial[]del personaje como en elhistorial[]de la escuadra.
Mapea: UC-26.
DELETE /escuadras/{slug}/miembro/{char_slug}
Remueve a un miembro de la escuadra.
- Efecto colateral: Quita la referencia de
miembros[]en la escuadra, elimina los tagsescuadra.{slug}ylealtad.escuadra.{slug}del personaje, y registra un hito detrasladoen elhistorial[]del personaje y un hito dereorganizacion(baja de miembro) en elhistorial[]de la escuadra.
Mapea: UC-27.
Encuentro (entidad implícita)
GET /meta/encuentro/new
Genera y devuelve una patente opaca de encuentro de uso futuro para escribir en escuadra.miembros[].iniciativa.encuentro (estado volátil de combate; ver docs/escuadra-modelo.md §2.2.1) y opcionalmente en escuadra.historial[].ref_batalla u otros campos narrativos.
- Response:
{ "patente": "K9F4M2P1" }— string^[A-Z0-9]{8}$. Servidor garantiza unicidad contra patentes ya vistas enescuadra.miembros[].iniciativa.encuentrode la base. - Sin parámetros. Sin efectos colaterales: el kit no persiste la patente en una tabla de encuentros; solo se compromete a no repetirla.
- Motivación: el kit no modela el encuentro como entidad (no hay
GET /encuentros/{patente}); ofrece este helper para que clientes downstream — motor de batalla, herramientas narrativas — usen una patente referenciable sin requerir un schema de combate completo. Ver GDDR-02 §1.7.
Mapea: UC-28.
Tabla plana
| Método | Path | UC |
|---|---|---|
| GET | /character |
01..04, 06, 16, 19, 20, 22 |
| GET | /character/{slug} |
05, 15, 16 |
| GET | /character/{slug}/historial |
17 |
| POST | /character/{slug}/event |
10..14, 18 |
| POST | /canonize |
07 |
| GET | /roster/mock |
08, 21 |
| GET | /meta/{categoria} |
09, 23 |
| GET | /meta/factions |
09 |
| GET | /meta/rangos |
09 |
| GET | /meta/hito_types |
09 |
| GET | /meta/encuentro/new |
28 |
| GET | /escuadras |
24 |
| GET | /escuadras/{slug} |
24 |
| POST | /escuadras |
25 |
| POST | /escuadras/{slug}/miembro |
26 |
| DELETE | /escuadras/{slug}/miembro/{char_slug} |
27 |
Catálogo completo de UCs en docs/user-stories.md.