# Requirements Traceability Matrix

> Last Updated: 2026-06-23
> Mode: /architecture-review full
> Coverage: 100% (all 40 requirements have ADR coverage or are implementation details needing no ADR)
> Story/Test linkage: Not yet available (Pre-Production phase — stories not written)

## How to Read This Matrix

| Column | Meaning |
|--------|---------|
| TR-ID | Stable requirement ID from tr-registry.yaml |
| GDD | Source design document |
| ADR | Architectural decision governing implementation |
| Status | COVERED (ADR exists) / NO ADR NEEDED (impl detail) |

## Full Traceability Matrix

| TR-ID | GDD | Requirement | ADR | Status |
|-------|-----|-------------|-----|--------|
| TR-NET-001 | sys-20-relay-transport.md | WebSocket client with wss/ws URL switching | — | NO ADR NEEDED |
| TR-NET-002 | sys-20-relay-transport.md | JSON lobby protocol (8 message types) | — | NO ADR NEEDED |
| TR-NET-003 | sys-20-relay-transport.md | Binary game packet (1-byte target + Synapse payload) | ADR-0001 | COVERED |
| TR-NET-004 | sys-20-relay-transport.md | Inbound 2-byte uint16LE sender ID from relay | ADR-0001 | COVERED |
| TR-NET-005 | sys-21-lobby-matchmaking.md | Host election from game_start.hostId | ADR-0004 | COVERED |
| TR-NET-006 | sys-33-fishnet-replication.md | Client-hosted FishNet authority model | ADR-0004 | COVERED |
| TR-NET-007 | sys-33-fishnet-replication.md | Custom RelayTransport : Transport bridge | ADR-0001 | COVERED |
| TR-NET-008 | sys-21-lobby-matchmaking.md | RelayPlayerId → FishNetConnectionId mapping | ADR-0001 | COVERED |
| TR-NET-009 | sys-33-fishnet-replication.md | 30Hz server tick rate | ADR-0005 | COVERED |
| TR-NET-010 | sys-21-lobby-matchmaking.md | No host migration in MVP | ADR-0004 | COVERED |
| TR-MOV-001 | sys-01-runner-movement.md | CharacterController + custom velocity | ADR-0005 | COVERED |
| TR-MOV-002 | sys-01-runner-movement.md | FishNet prediction (IReplicateData/IReconcileData) | ADR-0005 | COVERED |
| TR-MOV-003 | sys-01-runner-movement.md | Separate _hVelocity / _vVelocity | ADR-0005 | COVERED |
| TR-MOV-004 | sys-01-runner-movement.md | Coyote time 0.15s + jump buffer 0.10s | — | NO ADR NEEDED |
| TR-MOV-005 | sys-01-runner-movement.md | 0.1m reconciliation divergence tolerance | ADR-0005 | COVERED |
| TR-DAT-001 | sys-01-item-database.md | All game data in ScriptableObjects | — | NO ADR NEEDED |
| TR-DAT-002 | sys-01-item-database.md | String itemId synced (not SO references) | — | NO ADR NEEDED |
| TR-DAT-003 | sys-01-item-database.md | Resources.LoadAll<T>() for SO discovery | ADR-0003 | COVERED |
| TR-DAT-004 | sys-01-item-database.md | GlobalRules_SO single source of constants | — | NO ADR NEEDED |
| TR-PHY-001 | sys-05-geometric-los.md | LoS raycast at 30Hz (5 sockets, pre-culled) | ADR-0006 | COVERED |
| TR-PHY-002 | sys-06-eye-laser.md | Laser SphereCastAll (0.35m, 80m) | ADR-0006 | COVERED |
| TR-PHY-003 | sys-01-runner-movement.md | Wall detection SphereCast (0.4m, 0.6m) | ADR-0006 | COVERED |
| TR-PHY-004 | sys-11-prop-system.md | OnControllerColliderHit for prop collision | ADR-0006 | COVERED |
| TR-PHY-005 | sys-05-geometric-los.md | 8 named physics layers | ADR-0006 | COVERED |
| TR-UI-001 | sys-26-runner-hud.md | uGUI Canvas Screen Space Overlay | ADR-0007 | COVERED |
| TR-UI-002 | sys-26-runner-hud.md | DOTween for HUD animations | ADR-0007 | COVERED |
| TR-UI-003 | sys-02-eye-camera.md | Cinemachine 3 for camera impulse/shake | — | NO ADR NEEDED |
| TR-UI-004 | sys-02-eye-camera.md | Perspective camera, FOV-zoom, CanvasGroup noise | — | NO ADR NEEDED |
| TR-SCN-001 | sys-21-lobby-matchmaking.md | Two scenes: LobbyScene + GameScene | ADR-0002 | COVERED |
| TR-SCN-002 | sys-21-lobby-matchmaking.md | RelayClient + LobbyManager are DDOL | ADR-0002 | COVERED |
| TR-SCN-003 | sys-21-lobby-matchmaking.md | GameStartData static class | ADR-0002 | COVERED |
| TR-SCN-004 | sys-21-lobby-matchmaking.md | FishNet starts AFTER GameScene loads | ADR-0002 | COVERED |
| TR-SCN-005 | sys-21-lobby-matchmaking.md | PlayerSpawner waits for all clients (10s timeout) | — | NO ADR NEEDED |
| TR-MAP-001 | sys-10-procedural-map-generator.md | Seed-based deterministic generation | — | NO ADR NEEDED |
| TR-MAP-002 | sys-10-procedural-map-generator.md | Server-only generation (clients receive spawns) | ADR-0004 | COVERED |
| TR-MAP-003 | sys-10-procedural-map-generator.md | Constrained growth (2-4 floors, corridors, stairwells) | — | NO ADR NEEDED |
| TR-MAP-004 | sys-10-procedural-map-generator.md | Connector matching (direction-opposite, same size) | — | NO ADR NEEDED |
| TR-MAP-005 | sys-10-procedural-map-generator.md | Validation pass (connectivity, altar distance, min rooms) | — | NO ADR NEEDED |
| TR-MAP-006 | sys-10-procedural-map-generator.md | Content population (loot slots, altar placement) | — | NO ADR NEEDED |
| TR-MAP-007 | sys-10-procedural-map-generator.md | New RoomNode_SO auto-discovered (no code change) | ADR-0003 | COVERED |

## Coverage Summary

| Status | Count | % |
|--------|-------|---|
| COVERED — ADR exists | 26 | 65% |
| NO ADR NEEDED — implementation detail | 14 | 35% |
| GAP — no coverage | 0 | 0% |
| **Total requirements** | **40** | **100%** |

## Foundation Layer Gaps

None. All Foundation-layer requirements (Network, Scene, Map) have ADR coverage or are implementation details requiring no architectural decision.

## Story/Test Linkage (Not Yet Available)

Stories and tests will be linked after:
1. `/create-control-manifest` generates the layer rules
2. `/create-epics` generates Foundation + Core epics
3. `/create-stories` generates stories per epic
4. Implementation begins and test files are written

Run `/architecture-review rtm` after stories exist to generate the full chain.

## History

| Date | ADR Coverage | Notes |
|------|-------------|-------|
| 2026-06-23 | 100% (0 gaps) | Initial review — 29 requirements |
| 2026-06-23 | 100% (0 gaps) | Added SYS-10/12 map systems — 40 requirements total |
