docs: artifacts de /architecture-review (145 TRs, matriz de trazabilidad, veredicto CONCERNS)

This commit is contained in:
2026-08-16 16:51:52 -03:00
parent 928f58675f
commit d273e55dde
7 changed files with 1573 additions and 33 deletions
@@ -38,7 +38,7 @@ editarse sin recompilar. Se usan `PieceIdentity`, `AIPositionTables`, `BalanceCo
| Field | Value |
|-------|-------|
| **Depends On** | ADR-0000 (Accepted) — estancia 3: SO de estado runtime como fuente de verdad; ADR-0004 (Proposed) |
| **Depends On** | ADR-0000 (Accepted) — estancia 3: SO de estado runtime como fuente de verdad; ADR-0004 (Accepted) |
| **Enables** | Data-driven sin recompilar; editor tools de balance |
| **Blocks** | None |
| **Ordering Note** | La serialización de `CampaignState` requiere capa JSON propia (limitación `JsonUtility` con objetos anidados) |
+1 -1
View File
@@ -37,7 +37,7 @@ de escenas separadas, requiriendo pausar/resumir el gameplay (ADR-0007).
| Field | Value |
|-------|-------|
| **Depends On** | ADR-0000 (Accepted); ADR-0007 (Proposed) — pausa con `Time.timeScale` |
| **Depends On** | ADR-0000 (Accepted); ADR-0007 (Accepted) — pausa con `Time.timeScale` |
| **Enables** | Flujo de dados sin perder contexto del tablero; UX del VS |
| **Blocks** | None |
| **Ordering Note** | Requiere pausar/resumir gameplay (ADR-0007) |
@@ -37,7 +37,7 @@ Zobrist hashing. El hash se genera desde el estado del tablero y la repetición
| Field | Value |
|-------|-------|
| **Depends On** | ADR-0000 (Accepted); ADR-0001 (Proposed) — `DrawDetector` como servicio POCO |
| **Depends On** | ADR-0000 (Accepted); ADR-0001 (Accepted) — `DrawDetector` como servicio POCO |
| **Enables** | Detección de tablas por triple repetición (sistema 8) |
| **Blocks** | None |
| **Ordering Note** | None |
@@ -0,0 +1,146 @@
# Architecture Review Report
Date: 2026-08-16
Engine: Unity 6.3 LTS (6000.3.13f1)
GDDs Reviewed: 9 (`systems-index`, `ai-system`, `dice-system`, `campaign-system`,
`dialogue-system`, `piece-identity`, `dead-kings`, `game-concept`, `game-pillars`)
ADRs Reviewed: 10 (ADR-0000 … ADR-0009, all **Accepted**)
---
## Traceability Summary
Total requirements: 145
- ✅ Covered: 51 (35%)
- ⚠️ Partial: 27 (19%)
- ❌ Gaps: 67 (46%)
Full matrix: `docs/architecture/traceability-index.md`
Registry: `docs/architecture/tr-registry.yaml` (version 2, 145 TRs active)
### Coverage Gaps (no ADR exists)
Concentrated in Feature-layer systems with no dedicated ADR. Top gaps by system:
| System | Gaps | Suggested ADR | Domain | Engine Risk |
|--------|-----:|---------------|--------|-------------|
| dice | 15 | ADR-0011 — Dice/Purgatorio (reglas, estado, persistencia) | Gameplay Logic | LOW |
| piece-identity | 10 | ADR-0010 — Piece Identity (máquina de estados) | Gameplay Logic | LOW |
| dialogue | 13 | ADR-0012 — Dialogue (nodos, branching, presentación) | Gameplay Logic/UI | LOW |
| dead-kings | 13 | ADR-0013 — Dead Kings (input, pool, spawn) | Gameplay Logic/Persistence | LOW |
| sfx/music | 2 | ADR-0014 — Audio/SFX (buses y gestión) | Audio | MEDIUM |
| cloud-sync | 1 | (Full Vision, fuera de MVP) | Networking | MEDIUM |
| vs / game-pillars / others | 8 | Alcance VS, backend pool (P3) | — | LOW |
Notable coverage strengths: Foundation/Core layer is fully covered — Board
(ADR-0001), Scene Management (ADR-0009), Game State (ADR-0003/0009), Save/Load
(ADR-0004), HUD (ADR-0000), Draw Detection (ADR-0008), AI strategies
(ADR-0002/0001), Campaign data (ADR-0005), Dice UI overlay (ADR-0006/0007).
## Cross-ADR Conflicts
No real conflicts detected. Two minor documentation issues (not conflicts):
1. **Stale status references** — three ADRs reference dependencies as
`(Proposed)` even though those ADRs are now Accepted:
- ADR-0005 (line 41): `Depends On` ADR-0004 "(Proposed)"
- ADR-0006 (line 40): `Depends On` ADR-0007 "(Proposed)"
- ADR-0008 (line 40): `Depends On` ADR-0001 "(Proposed)"
→ Cosmetic; fix the labels to `(Accepted)`. No impact on implementation order.
2. **ADR-0009 duplicate reference** — ADR-0009 (consolidación SceneTransitionManager)
is a special case: it is the *resolution* of the duplicate-manager anti-pattern
from ADR-0000 (estancia 5) rather than a new pattern. No contradiction.
## ADR Dependency Order
Topologically sorted implementation order (all 10 Accepted):
```
Foundation (no dependencies):
1. ADR-0000 — Patrones de Infraestructura Global
Depends on Foundation:
2. ADR-0001 — Service Layer POCO (requiere ADR-0000)
3. ADR-0003 — Event-Driven Communication (requiere ADR-0000)
4. ADR-0004 — Singleton Dual (requiere ADR-0000)
5. ADR-0007 — Timescale y Pausas (requiere ADR-0000)
Depends on the above:
6. ADR-0002 — Strategy Pattern IA (requiere ADR-0001, ADR-0004)
7. ADR-0005 — ScriptableObject Data Container (requiere ADR-0004)
8. ADR-0006 — Overlay UI (requiere ADR-0007)
9. ADR-0008 — Position Hashing / FEN-like (requiere ADR-0001)
Resolution ADR:
10. ADR-0009 — Consolidación SceneTransitionManager (requiere ADR-0000, ADR-0004)
```
Unresolved dependencies: none. Cycles: none. The three `(Proposed)` labels in
ADR-0005/0006/0008 are already satisfied — their dependencies are Accepted.
## GDD Revision Flags
No GDD revision flags — all GDD assumptions are consistent with verified engine
behaviour (Unity 6.3 LTS, no post-cutoff APIs, deprecated APIs accepted as debt).
## Engine Compatibility Issues
```
### Engine Audit Results
Engine: Unity 6.3 LTS (6000.3.13f1)
ADRs with Engine Compatibility section: 10 / 10
Deprecated API References:
- ADR-0000: legacy `Input` + `Resources.Load` — documented as accepted debt
(verificado contra deprecated-apis.md)
Stale Version References:
- None — all 10 ADRs pinned to Unity 6.3 LTS
Post-Cutoff API Conflicts:
- None — all ADRs report Post-Cutoff APIs Used: "None"
```
Note: `unity-specialist` subagent not available in this environment. Not
blocking — no ADR uses post-cutoff APIs, so there is nothing for a specialist to
verify beyond the audit, which passed.
## Architecture Document Coverage
- All systems from `systems-index.md` appear in the architecture layers
(Foundation → Core → Feature → Presentation → Polish).
- Data flow covers cross-system communication (events from ADR-0003).
- No orphaned architecture (no systems in the doc without a GDD).
- `architecture.md` was updated in-session: STM consolidation (ADR-0009) and
`AIController` (ADR-0002) reflected; problem #1 (manager duplicado) resolved.
---
### Verdict: CONCERNS
No blocking conflicts and a fully covered Foundation/Core layer, but the
signature Feature-layer systems (Dice/Purgatorio, Piece Identity, Dialogue,
Dead Kings) and Audio have no dedicated ADRs. They can be implemented against
existing ADRs, but the risk of un-architected decisions (state ownership,
data schemas, cross-system contracts) grows the longer they go un-ADR'd.
### Blocking Issues
None.
### Required ADRs
Prioritised (most foundational first):
1. **ADR-0010 — Piece Identity (máquina de estados)** — covers 10 gaps; other
systems depend on piece state (tooltip, purgatorio eligibility).
2. **ADR-0011 — Dice/Purgatorio (reglas, estado, persistencia)** — the
signature mechanic; 15 gaps; defines dice state machine and outcome contract
with Campaign.
3. **ADR-0012 — Dialogue (nodos, branching y presentación)** — 13 gaps; defines
DialogueNode schema and Game State handoff contract.
4. **ADR-0013 — Dead Kings (input, pool y spawn)** — 13 gaps; defines pool
persistence contract and spawn probability.
5. **ADR-0014 — Audio/SFX (buses y gestión)** — 2 gaps; Polish layer, lowest
priority before pre-production.
Re-run `/architecture-review` after each new ADR is written to verify coverage
improves.
File diff suppressed because it is too large Load Diff
+226
View File
@@ -0,0 +1,226 @@
# Architecture Traceability Index
Last Updated: 2026-08-16
Engine: Unity 6.3 LTS (6000.3.13f1)
Generated by: /architecture-review (full)
## Coverage Summary
- Total requirements: 145
- ✅ Covered: 51 (35%)
- ⚠️ Partial: 27 (19%)
- ❌ Gaps: 67 (46%)
Coverage by layer concentration: Foundation/Core layer systems (Board, Scene
Management, Game State, Save/Load, HUD, Draw Detection, AI, Campaign, Dice UI)
are covered. The gaps concentrate in **Feature-layer** systems that have no
dedicated ADR: Dice/Purgatorio rules (15), Piece Identity (10), Dialogue (13),
Dead Kings (13), plus audio (SFX/Music), cloud-sync, VS scope, and a few
game-concept/pillar requirements.
## Full Matrix
| TR-ID | GDD | System | Requirement | ADR Coverage | Status |
|-------|-----|--------|-------------|--------------|--------|
| TR-board-001 | systems-index.md | board | Tablero 8x8 con casillas clickeables | ADR-0001 | ✅ |
| TR-board-002 | systems-index.md | board | Board System es la base sin dependencias (Foundation Layer) | ADR-0001 | ✅ |
| TR-scene-mgmt-001 | systems-index.md | scene-mgmt | Transiciones entre escenas vía SceneTransitionManager (Sprint 1) | ADR-0009 | ✅ |
| TR-scene-mgmt-002 | systems-index.md | scene-mgmt | Soporta transiciones entre menú, tablero, diálogo y purgatorio | ADR-0009 | ✅ |
| TR-game-state-001 | systems-index.md | game-state | Estados: menú, partida, diálogo, purgatorio y game over | ADR-0003, ADR-0009 | ✅ |
| TR-game-state-002 | systems-index.md | game-state | Depende de Scene Management | ADR-0009 | ✅ |
| TR-save-load-001 | systems-index.md | save-load | Estado de campaña persiste como CampaignState SO (parcial) | ADR-0004 | ✅ |
| TR-save-load-002 | systems-index.md | save-load | Depende de Game State Manager | ADR-0004 | ✅ |
| TR-hud-001 | systems-index.md | hud | HUD parcial implementado con PieceTooltip | ADR-0000 | ✅ |
| TR-hud-002 | systems-index.md | hud | Depende de Piece Identity y Turn System | ADR-0003 | ⚠️ |
| TR-draw-detection-001 | systems-index.md | draw-detection | Detecta stalemate, material insuficiente, threefold y 50 movimientos | ADR-0001, ADR-0008 | ✅ |
| TR-ai-001 | systems-index.md | ai | Strategy pattern y 3 dificultades | ADR-0002 | ✅ |
| TR-ai-002 | systems-index.md | ai | Depende de Piece Movement | ADR-0001 | ✅ |
| TR-ai-003 | ai-system.md | ai | La IA siempre controla las piezas negras | ADR-0002 | ⚠️ |
| TR-ai-004 | ai-system.md | ai | Dificultad configurada desde CampaignSystem vía ai_config | ADR-0002 | ✅ |
| TR-ai-005 | ai-system.md | ai | think_time_ms por dificultad: Easy 300-600, Medium 500-900, Hard 800-1500 | ADR-0002 | ✅ |
| TR-ai-006 | ai-system.md | ai | Todos los movimientos de la IA legales | ADR-0001 | ✅ |
| TR-ai-007 | ai-system.md | ai | Easy random con preferencia de capturas | ADR-0002 | ✅ |
| TR-ai-008 | ai-system.md | ai | Medium evalúa a 1 ply con score material+centro+seguridad | ADR-0002 | ✅ |
| TR-ai-009 | ai-system.md | ai | Hard minimax con alpha-beta 2-3 ply | ADR-0002 | ✅ |
| TR-ai-010 | ai-system.md | ai | Valores materiales de piezas | ADR-0002 | ✅ |
| TR-ai-011 | ai-system.md | ai | Tablas posicionales cargadas desde datos configurables | ADR-0002 | ✅ |
| TR-ai-012 | ai-system.md | ai | Eval completa (Hard): material + positional + mobility + seguridad + estructura | ADR-0002 | ✅ |
| TR-ai-013 | ai-system.md | ai | Sin movimientos legales → tablas | ADR-0001 | ✅ |
| TR-ai-014 | ai-system.md | ai | Corte de búsqueda a 5s con mejor movimiento encontrado (hard) | ADR-0002 | ✅ |
| TR-ai-015 | ai-system.md | ai | Reducción de profundidad 3→2 si la búsqueda excede 200ms | ADR-0002 | ✅ |
| TR-ai-016 | ai-system.md | ai | Empate de scores → elección aleatoria | ADR-0002 | ⚠️ |
| TR-ai-017 | ai-system.md | ai | Estados Waiting, Thinking, Moving, Done; devuelve control al Turn System | ADR-0002 | ✅ |
| TR-ai-018 | ai-system.md | ai | Indicador 'pensando' y deslizamiento suave de la pieza | — | ❌ |
| TR-ai-019 | ai-system.md | ai | minimax_time_limit_ms = 5000 (rango 2000-10000) | ADR-0002 | ✅ |
| TR-ai-020 | ai-system.md | ai | La IA ejecuta su movimiento llamando GameManager.MovePiece | ADR-0001, ADR-0003 | ✅ |
| TR-dice-001 | systems-index.md | dice | Depende de Piece Identity y Turn System | ADR-0003 | ⚠️ |
| TR-dice-002 | dice-system.md | dice | Purgatorio se activa opcionalmente al capturar pieza del jugador | ADR-0003 | ✅ |
| TR-dice-003 | dice-system.md | dice | 2d6 vs 2d6; empate gana la Muerte; sin re-rolls | — | ❌ |
| TR-dice-004 | dice-system.md | dice | player_roll = 2d6 + piece_bonus + desperation - penalty; death_roll = 2d6 | — | ❌ |
| TR-dice-005 | dice-system.md | dice | piece_bonus por valor: Reina +2, Torre/Alfil/Caballo +1, Peón 0 | — | ❌ |
| TR-dice-006 | dice-system.md | dice | purgatory_penalty = -1 acumulativo (rango 0-3) | — | ❌ |
| TR-dice-007 | dice-system.md | dice | desperation_bonus = +1 si ≤4 piezas | — | ❌ |
| TR-dice-008 | dice-system.md | dice | Victoria → recovered y regresa en el siguiente tablero | ADR-0005 | ⚠️ |
| TR-dice-009 | dice-system.md | dice | Derrota → dead_permanent, nunca regresa | — | ❌ |
| TR-dice-010 | dice-system.md | dice | Máximo 3 visitas por tablero; luego captura = muerte directa | — | ❌ |
| TR-dice-011 | dice-system.md | dice | El Rey NUNCA activa el Purgatorio | — | ❌ |
| TR-dice-012 | dice-system.md | dice | Resultado negativo clamp a mínimo 2 | — | ❌ |
| TR-dice-013 | dice-system.md | dice | Capturas en secuencia → solo la última ofrece Purgatorio | — | ❌ |
| TR-dice-014 | dice-system.md | dice | Cerrar durante el Purgatorio = 'No' (anti-exploit) | — | ❌ |
| TR-dice-015 | dice-system.md | dice | Turn System se pausa durante el Purgatorio | ADR-0007 | ✅ |
| TR-dice-016 | dice-system.md | dice | dice_animation_duration_ms = 2000 (rango 1000-4000) | — | ❌ |
| TR-dice-017 | dice-system.md | dice | Impact moments configurables (silence/landing/reveal/flash) | — | ❌ |
| TR-dice-018 | dice-system.md | dice | Probabilidades de victoria ~42% base, Reina ~58%, peón 3ª ~28% | — | ❌ |
| TR-dice-019 | dice-system.md | dice | Dados animados con física simulada ('sobre piedra') | — | ❌ |
| TR-dice-020 | dice-system.md | dice | Estados: Inactive, Offer, Rolling, Player Wins, Death Wins, Closed | ADR-0006 | ✅ |
| TR-dice-021 | dice-system.md | dice | Resultado notificado a Campaign System para persistencia | ADR-0003 | ✅ |
| TR-campaign-001 | systems-index.md | campaign | Implementado con CampaignState ScriptableObject | ADR-0005 | ✅ |
| TR-campaign-002 | systems-index.md | campaign | Depende de Board System y Game State Manager | ADR-0001 | ✅ |
| TR-campaign-003 | campaign-system.md | campaign | Secuencia lineal de capítulos sin selección de nivel | ADR-0005 | ⚠️ |
| TR-campaign-004 | campaign-system.md | campaign | Cada capítulo: id, name, theme, diálogos, ai_difficulty, enemy_config, special_rules | ADR-0005 | ✅ |
| TR-campaign-005 | campaign-system.md | campaign | Datos de capítulo desde JSON, incl. ai_config | ADR-0005 | ✅ |
| TR-campaign-006 | campaign-system.md | campaign | Entre tableros: diálogo outro → memorial → diálogo intro | ADR-0005 | ⚠️ |
| TR-campaign-007 | campaign-system.md | campaign | Ejército recalculado entre capítulos (alive/recovered vs dead_permanent) | ADR-0005 | ⚠️ |
| TR-campaign-008 | campaign-system.md | campaign | Victoria = jaque mate enemigo o condición especial; derrota → Dead Kings | ADR-0003, ADR-0004 | ✅ |
| TR-campaign-009 | campaign-system.md | campaign | effective_difficulty = base + (chapter_index * 0.5) | — | ❌ |
| TR-campaign-010 | campaign-system.md | campaign | Progreso guardado al inicio de cada capítulo; no save mid-partida | ADR-0004 | ✅ |
| TR-campaign-011 | campaign-system.md | campaign | Cierre a mitad de capítulo → reanuda al inicio del capítulo | ADR-0004 | ✅ |
| TR-campaign-012 | campaign-system.md | campaign | Pieza recuperada NO disponible en el mismo tablero | ADR-0005 | ✅ |
| TR-campaign-013 | campaign-system.md | campaign | Estados: Not Started, Dialogue, Board Active, Purgatory, Board Result, Memorial, etc. | — | ❌ |
| TR-campaign-014 | campaign-system.md | campaign | memorial_duration_ms = 5000 (rango 2000-10000) | — | ❌ |
| TR-campaign-015 | campaign-system.md | campaign | Scene Management realiza las transiciones entre escenas | ADR-0009 | ✅ |
| TR-campaign-016 | campaign-system.md | campaign | Perder todas las piezas excepto el Rey → la partida continúa | ADR-0001 | ⚠️ |
| TR-campaign-017 | campaign-system.md | campaign | Dificultad de IA escala entre capítulos | ADR-0002 | ✅ |
| TR-campaign-018 | campaign-system.md | campaign | Un capítulo se desbloquea al completar el anterior | ADR-0005 | ⚠️ |
| TR-dialogue-001 | systems-index.md | dialogue | GDD diseñado; depende de Campaign System | ADR-0005 | ⚠️ |
| TR-dialogue-002 | dialogue-system.md | dialogue | Diálogos desde JSON/ScriptableObject, no hardcodeados | ADR-0005 | ⚠️ |
| TR-dialogue-003 | dialogue-system.md | dialogue | Cada diálogo es una secuencia de nodos (DialogueNode) | — | ❌ |
| TR-dialogue-004 | dialogue-system.md | dialogue | Cada nodo: speaker, portrait, text, next_node_id, conditions | — | ❌ |
| TR-dialogue-005 | dialogue-system.md | dialogue | Avance con click/tecla; sin selección de respuestas en el VS | — | ❌ |
| TR-dialogue-006 | dialogue-system.md | dialogue | Branching con condiciones (piece_alive, chapter_complete, pieces_lost) | — | ❌ |
| TR-dialogue-007 | dialogue-system.md | dialogue | Quotes in-game de 1 nodo como overlay 1-2s sin pausar | ADR-0006 | ⚠️ |
| TR-dialogue-008 | dialogue-system.md | dialogue | char_display_interval_ms = base_speed / multiplier | — | ❌ |
| TR-dialogue-009 | dialogue-system.md | dialogue | Primer click texto completo, segundo avanza (anti-skip) | — | ❌ |
| TR-dialogue-010 | dialogue-system.md | dialogue | Condición con pieza inexistente → false, nodo default | — | ❌ |
| TR-dialogue-011 | dialogue-system.md | dialogue | Sin portrait → texto sin portrait (graceful) | — | ❌ |
| TR-dialogue-012 | dialogue-system.md | dialogue | Sin default y todas false → salta al siguiente nodo | — | ❌ |
| TR-dialogue-013 | dialogue-system.md | dialogue | capture_quote_duration_ms = 1500 (rango 500-3000) | — | ❌ |
| TR-dialogue-014 | dialogue-system.md | dialogue | Estados: Inactive, Displaying, Waiting Input, Branching, Complete | — | ❌ |
| TR-dialogue-015 | dialogue-system.md | dialogue | Notifica a Game State al terminar el diálogo | ADR-0003 | ⚠️ |
| TR-dialogue-016 | dialogue-system.md | dialogue | Dice System dispara líneas contextuales de la Muerte | ADR-0003 | ⚠️ |
| TR-dialogue-017 | dialogue-system.md | dialogue | typewriter_effect (true) texto gradual | — | ❌ |
| TR-dialogue-018 | dialogue-system.md | dialogue | allow_skip (true); base_text_speed_ms = 30 (rango 15-60) | — | ❌ |
| TR-piece-identity-001 | piece-identity.md | piece-identity | 16 piezas blancas asignan identidades del pool narrativo al iniciar campaña | ADR-0005 | ⚠️ |
| TR-piece-identity-002 | piece-identity.md | piece-identity | Cada pieza: name, role, relationship, quotes[], isAlive | ADR-0005 | ✅ |
| TR-piece-identity-003 | piece-identity.md | piece-identity | Identidades asignadas por tipo de pieza | ADR-0005 | ⚠️ |
| TR-piece-identity-004 | piece-identity.md | piece-identity | Captura → nombre+quote, Purgatorio, isAlive = false si pierde | ADR-0003 | ⚠️ |
| TR-piece-identity-005 | piece-identity.md | piece-identity | Muertos permanentes visibles en memorial entre partidas | — | ❌ |
| TR-piece-identity-006 | piece-identity.md | piece-identity | Tipo extinto no se repone en tableros siguientes | — | ❌ |
| TR-piece-identity-007 | piece-identity.md | piece-identity | Estados: Alive, Captured, In Purgatory, Recovered, Dead (Permanent) | — | ❌ |
| TR-piece-identity-008 | piece-identity.md | piece-identity | Board consulta identidad para nombre/tooltip | ADR-0005 | ⚠️ |
| TR-piece-identity-009 | piece-identity.md | piece-identity | Al morir la campaña, perfil del Rey alimenta Dead Kings | — | ❌ |
| TR-piece-identity-010 | piece-identity.md | piece-identity | Reina muerta en el 1er tablero → seguir sin reina | — | ❌ |
| TR-piece-identity-011 | piece-identity.md | piece-identity | Todos los peones muertos → tableros sin peones | — | ❌ |
| TR-piece-identity-012 | piece-identity.md | piece-identity | Recuperada que cae puede ir al Purgatorio otra vez | — | ❌ |
| TR-piece-identity-013 | piece-identity.md | piece-identity | Rey nunca al Purgatorio; mate → Dead Kings | — | ❌ |
| TR-piece-identity-014 | piece-identity.md | piece-identity | Peón muerto permanente no se puede promover | — | ❌ |
| TR-piece-identity-015 | piece-identity.md | piece-identity | Delay captura 1500ms, quotes 3 (2-5), memorial true | — | ❌ |
| TR-piece-identity-016 | piece-identity.md | piece-identity | Sistema basado en datos, no en cálculos | ADR-0005 | ✅ |
| TR-dead-kings-001 | systems-index.md | dead-kings | Depende de Campaign System y Persistencia | ADR-0004 | ⚠️ |
| TR-dead-kings-002 | dead-kings.md | dead-kings | Trigger: jaque mate al Rey del jugador | ADR-0003 | ✅ |
| TR-dead-kings-003 | dead-kings.md | dead-kings | Nombre máx 20, mensaje máx 100, filtrado de contenido | — | ❌ |
| TR-dead-kings-004 | dead-kings.md | dead-kings | Datos: player_name, message, chapter_reached, pieces_lost, date, stats | ADR-0004 | ⚠️ |
| TR-dead-kings-005 | dead-kings.md | dead-kings | Pool local JSON en persistentDataPath; futuro cloud | ADR-0004 | ✅ |
| TR-dead-kings-006 | dead-kings.md | dead-kings | Máximo 100 Reyes; FIFO (remover antes de insertar) | — | ❌ |
| TR-dead-kings-007 | dead-kings.md | dead-kings | Probabilidad Rey Muerto: 20% ch1, 40% ch2, 60% ch3 | — | ❌ |
| TR-dead-kings-008 | dead-kings.md | dead-kings | spawn_chance = base + chapter*multiplier; solo si pool.count > 0 | — | ❌ |
| TR-dead-kings-009 | dead-kings.md | dead-kings | Pool vacío → rey estándar predefinido | — | ❌ |
| TR-dead-kings-010 | dead-kings.md | dead-kings | Capturar Rey Muerto → mostrar nombre/mensaje original | — | ❌ |
| TR-dead-kings-011 | dead-kings.md | dead-kings | Visual distinto (corona rota, aura roja, nombre flotante) | — | ❌ |
| TR-dead-kings-012 | dead-kings.md | dead-kings | Nombre vacío → 'Anónimo' | — | ❌ |
| TR-dead-kings-013 | dead-kings.md | dead-kings | Contenido ofensivo → '***' sin bloquear envío | — | ❌ |
| TR-dead-kings-014 | dead-kings.md | dead-kings | Pool corrupto → pool nuevo vacío + rey estándar | — | ❌ |
| TR-dead-kings-015 | dead-kings.md | dead-kings | Enfrentar tu propio Rey Muerto (feature, no bug) | — | ❌ |
| TR-dead-kings-016 | dead-kings.md | dead-kings | Debounce 500ms en botón de enviar | — | ❌ |
| TR-dead-kings-017 | dead-kings.md | dead-kings | Estados: Inactive, Input Screen, Saving, Spawned, Revealed | — | ❌ |
| TR-dead-kings-018 | dead-kings.md | dead-kings | Save/Load lee y escribe el pool de Dead Kings | ADR-0004 | ✅ |
| TR-dice-ui-001 | systems-index.md | dice-ui | 3 pantallas UI: Offer, Roll y Result | ADR-0006 | ✅ |
| TR-sfx-001 | systems-index.md | sfx | Bus de audio para efectos | — | ❌ |
| TR-music-001 | systems-index.md | music | Depende de Scene Management | — | ❌ |
| TR-cloud-sync-001 | systems-index.md | cloud-sync | Persistencia de Reyes Muertos en la nube (Full Vision) | — | ❌ |
| TR-timeline-ii-001 | systems-index.md | timeline-ii | Reutiliza infraestructura existente en vez de duplicarla | ADR-0004 | ⚠️ |
| TR-deps-001 | systems-index.md | deps | Capas Foundation → Core → Feature → Presentation → Polish | ADR-0000 | ⚠️ |
| TR-vs-001 | systems-index.md | vs | Completar los 3 tableros del VS en 30-60 minutos | — | ❌ |
| TR-vs-002 | systems-index.md | vs | El VS requiere ver al menos un Rey Muerto de otro jugador | — | ❌ |
| TR-game-concept-001 | game-concept.md | game-concept | Plataforma PC, expandible a móvil | — | ❌ |
| TR-game-concept-002 | game-concept.md | game-concept | Single-player asíncrono global; sin PvP directo | ADR-0004 | ⚠️ |
| TR-game-concept-003 | game-concept.md | game-concept | Sesiones 15-30 min; campaña 1-2 horas | — | ❌ |
| TR-game-concept-004 | game-concept.md | game-concept | Core loop: diálogo → partida → Purgatorio → diálogo → siguiente | ADR-0005, ADR-0009, ADR-0006 | ⚠️ |
| TR-game-concept-005 | game-concept.md | game-concept | Derrota → escribir nombre+mensaje → pool global | ADR-0004 | ⚠️ |
| TR-game-concept-006 | game-concept.md | game-concept | La Muerte aparece con dados al caer una pieza | ADR-0006 | ⚠️ |
| TR-game-concept-007 | game-concept.md | game-concept | Dificultad creciente fuerza sacrificios tácticos | — | ❌ |
| TR-game-pillars-001 | game-pillars.md | game-pillars | Identidad de piezas con estado persistente por campaña (P1) | ADR-0005 | ✅ |
| TR-game-pillars-002 | game-pillars.md | game-pillars | Dados con estado propio, animación e integración con el tablero (P2) | ADR-0006, ADR-0003, ADR-0007 | ✅ |
| TR-game-pillars-003 | game-pillars.md | game-pillars | El Purgatorio es opcional — el jugador elige (P2) | ADR-0006 | ✅ |
| TR-game-pillars-004 | game-pillars.md | game-pillars | Backend de Reyes Muertos: pool JSON o cloud (P3) | — | ❌ |
| TR-game-pillars-005 | game-pillars.md | game-pillars | Sin multijugador en tiempo real (P3) | — | ❌ |
| TR-game-pillars-006 | game-pillars.md | game-pillars | Pool no infinito; Reyes antiguos se desvanecen (P3) | — | ❌ |
| TR-game-pillars-007 | game-pillars.md | game-pillars | Campaña con progresión, configuración por tablero e IA (P4) | ADR-0005, ADR-0002 | ✅ |
| TR-game-pillars-008 | game-pillars.md | game-pillars | Reglas especiales o condiciones de victoria únicas por tablero (P4) | — | ❌ |
## Known Gaps
Requirements without ADR coverage, grouped by system, priority order:
Foundation/Core first, then Feature. Suggested ADR titles reference
`/architecture-decision [title]`.
### Feature layer — Dice / Purgatorio (15 gaps)
The dice confrontation rules, modifiers and persistence semantics have no ADR.
These are the highest-value gaps: the Purgatorio is the game's signature mechanic.
- ❌ TR-dice-003, TR-dice-004, TR-dice-005, TR-dice-006, TR-dice-007 — fórmulas del enfrentamiento (2d6 vs 2d6, bonuses, penalties)
- ❌ TR-dice-009, TR-dice-010, TR-dice-011, TR-dice-012, TR-dice-013 — semántica de resultado (dead_permanent, límite 3 visitas, Rey excluido, clamp, secuencia)
- ❌ TR-dice-014 — anti-exploit (cerrar = 'No')
- ❌ TR-dice-016, TR-dice-017, TR-dice-018, TR-dice-019 — configuración de animación, impacto y probabilidades
→ Suggested ADR: **ADR-0011 — Dice/Purgatorio (reglas, estado y persistencia)**
Domain: Gameplay Logic · Engine Risk: LOW
### Feature layer — Piece Identity (10 gaps)
- ❌ TR-piece-identity-005 (memorial), 006 (tipo extinto), 007 (estados), 009 (perfil → Dead Kings), 010/011 (pérdidas orgánicas), 012 (re-entrada), 013 (Rey excluido), 014 (promoción condicionada), 015 (config)
→ Suggested ADR: **ADR-0010 — Piece Identity (máquina de estados)**
Domain: Gameplay Logic · Engine Risk: LOW
### Feature layer — Dialogue (13 gaps)
- ❌ TR-dialogue-003/004 (esquema de nodos), 005 (avance), 006 (branching), 008-013 (typewriter, anti-skip, fail-safes), 014 (estados), 017/018 (config)
→ Suggested ADR: **ADR-0012 — Dialogue (nodos, branching y presentación)**
Domain: Gameplay Logic / UI · Engine Risk: LOW
### Feature layer — Dead Kings (13 gaps)
- ❌ TR-dead-kings-003 (validación input), 006 (FIFO 100), 007/008 (spawn probabilístico), 009-016 (fallbacks, reveal, sanitización, debounce), 017 (estados)
→ Suggested ADR: **ADR-0013 — Dead Kings (input, pool y spawn)**
Domain: Gameplay Logic / Persistence · Engine Risk: LOW
### Polish layer — Audio (2 gaps)
- ❌ TR-sfx-001 (bus de audio), TR-music-001 (música por escena)
→ Suggested ADR: **ADR-0014 — Audio/SFX (buses y gestión)**
Domain: Audio · Engine Risk: MEDIUM
### Feature layer — otros (5 gaps)
- ❌ TR-cloud-sync-001 — persistencia cloud de Reyes Muertos (Full Vision, no MVP)
- ❌ TR-vs-001, TR-vs-002 — alcance del VS (30-60 min, ver un Rey Muerto ajeno)
- ❌ TR-game-pillars-004, TR-game-pillars-006 — backend y desvanecimiento del pool (P3)
### Core layer — menor (5 gaps)
- ❌ TR-ai-018 — feedback visual de la IA (indicador 'pensando', deslizamiento) — Polish
- ❌ TR-campaign-009, TR-campaign-013, TR-campaign-014 — fórmula de dificultad efectiva, estados de campaña y duración del memorial
- ❌ TR-game-concept-003, TR-game-concept-007 — duración de sesión y dificultad creciente (medibles, no arquitectura)
## Superseded Requirements
None — first review run (2026-08-16). All 145 registered requirements are `active`.
Registry: `docs/architecture/tr-registry.yaml` (version 2).
+9
View File
@@ -0,0 +1,9 @@
# Session State
## Session Extract — /architecture-review 2026-08-16
- Verdict: CONCERNS
- Requirements: 145 total — 51 covered, 27 partial, 67 gaps
- New TR-IDs registered: 145 (first run; all `active`)
- GDD revision flags: None
- Top ADR gaps: ADR-0010 Piece Identity (estados), ADR-0011 Dice/Purgatorio (reglas/estado), ADR-0012 Dialogue (nodos/branching)
- Report: docs/architecture/architecture-review-2026-08-16.md