# BreakEscape Rails Engine Migration - Planning Summary

## Overview

This directory contains comprehensive planning documents for migrating BreakEscape from a standalone browser application to a Rails Engine that can be mounted in Hacktivity Cyber Security Labs.

---

## Executive Summary

### Current State
- **Architecture:** Pure client-side JavaScript application
- **Data Storage:** Static JSON files loaded at game start
- **Game Logic:** All validation happens client-side
- **Deployment:** Standalone HTML/JS/CSS files

### Target State
- **Architecture:** Rails Engine with client-server model
- **Data Storage:** PostgreSQL database with Rails models
- **Game Logic:** Server validates critical actions, client handles UI
- **Deployment:** Mountable Rails engine, integrates with Hacktivity

### Key Benefits
1. **Security:** Server-side validation prevents cheating
2. **Scalability:** Database-driven content, per-user scenarios
3. **Integration:** Mounts in Hacktivity with Devise authentication
4. **Flexibility:** Can run standalone or mounted
5. **Analytics:** Track player progress, difficulty, completion

---

## Planning Documents

### 1. NPC Migration Options
**File:** `NPC_MIGRATION_OPTIONS.md`

**Purpose:** Analyzes three approaches for migrating NPCs and Ink dialogue scripts to server-client model.

**Key Sections:**
- Current NPC architecture (ink scripts, event mappings, timed messages)
- Security concerns and state synchronization challenges
- **Option 1:** Full server-side NPCs (maximum security, higher latency)
- **Option 2:** Hybrid - scripts client-side, validation server-side (recommended)
- **Option 3:** Progressive loading (balanced approach)
- Comparison matrix and recommendations
- Database schema for NPCs

**Recommendation:** **Hybrid approach** for most NPCs
- Load ink scripts at startup (instant dialogue)
- Validate actions server-side (secure item giving, door unlocking)
- Sync conversation history asynchronously
- Best balance of UX and security

**Read this if you need to:**
- Understand NPC system architecture
- Choose an approach for dialogue management
- Plan NPC database schema
- Implement NPC API endpoints

---

### 2. Client-Server Separation Plan
**File:** `CLIENT_SERVER_SEPARATION_PLAN.md`

**Purpose:** Detailed plan for separating client-side and server-side responsibilities across all game systems.

**Key Sections:**
- Current vs future data flow
- System-by-system analysis:
  - Room loading (easiest - already has hooks)
  - Unlock system (move validation server-side)
  - Inventory management (optimistic UI, server authority)
  - Container system (fetch contents on unlock)
  - NPC system (see separate doc)
  - Minigames (keep mechanics client-side, validate results)
- Data access abstraction layer (`GameDataAccess` class)
- Migration strategy (gradual, system by system)
- Testing strategy (dual-mode support)
- Risk mitigation (latency, offline play, state consistency)

**Critical Insight:**
> The current architecture already supports this migration with minimal changes. The `loadRoom()` hook, Tiled/scenario separation, and TiledItemPool matching are perfect for server-client.

**Read this if you need to:**
- Understand what changes are needed
- Plan the refactoring approach
- See code examples for each system
- Create the data access abstraction layer

---

### 3. Rails Engine Migration Plan
**File:** `RAILS_ENGINE_MIGRATION_PLAN.md`

**Purpose:** Complete implementation guide with Rails commands, file structure, code examples, and timeline.

**Key Sections:**
- Rails Engine fundamentals
- Complete project structure (where every file goes)
- Phase-by-phase implementation:
  - Phase 1: Create engine skeleton
  - Phase 2: Move assets (bash script provided)
  - Phase 3: Database schema (all migrations)
  - Phase 4: Models and business logic
  - Phase 5: Controllers and API
  - Phase 6: Policies (Pundit)
  - Phase 7: Routes
  - Phase 8: Mounting in Hacktivity
  - Phase 9: Data import (rake tasks)
  - Phase 10: Views
  - Phase 11: Testing
  - Phase 12: Deployment
- 18-20 week timeline
- Complete code examples for all components

**Ready-to-Run Commands:**
```bash
# Generate engine
rails plugin new break_escape --mountable --database=postgresql

# Generate models
rails g model Scenario name:string description:text ...
rails g model GameInstance user:references scenario:references ...
# ... (all models documented)

# Import scenarios
rails break_escape:import_scenario['scenarios/ceo_exfil.json']

# Mount in Hacktivity
mount BreakEscape::Engine, at: '/break_escape'
```

**Read this if you need to:**
- Start the actual migration
- Understand Rails Engine structure
- Get complete database schema
- See full code examples
- Plan deployment

---

## Migration Compatibility Assessment

### Already Compatible ✅

From `ARCHITECTURE_COMPARISON.md` and `SERVER_CLIENT_MODEL_ASSESSMENT.md`:

1. **Room Loading System**
   - ✅ Clean separation of Tiled (visual) and Scenario (logic)
   - ✅ Lazy loading with `loadRoom()` hook
   - ✅ TiledItemPool matching is deterministic
   - ✅ Only need to change data source (`window.gameScenario` → server API)

2. **Sprite Creation**
   - ✅ `createSpriteFromMatch()` works identically
   - ✅ `applyScenarioProperties()` agnostic to data source
   - ✅ Visual and logic properties cleanly separated

3. **Interaction Systems**
   - ✅ All systems read sprite properties (don't care about source)
   - ✅ Inventory, locks, containers, minigames all compatible

### Needs Changes 🔄

1. **Unlock Validation**
   - Client determines success → Server validates attempt
   - Client knows correct PIN → Server stores and checks PIN
   - ~1-2 weeks to refactor

2. **Container Contents**
   - Pre-loaded in scenario → Fetched when unlocked
   - Client shows all contents → Server reveals incrementally
   - ~1 week to refactor

3. **Inventory State**
   - Pure client-side → Synced to server
   - Local state → Server as source of truth
   - ~1-2 weeks to refactor

4. **NPC System**
   - See `NPC_MIGRATION_OPTIONS.md`
   - Recommended: Hybrid approach
   - ~2-3 weeks to implement

---

## Quick Start Guide

### For Understanding the Migration

**Read in this order:**

1. **Start here:** `ARCHITECTURE_COMPARISON.md` (in parent directory)
   - Understand current architecture
   - See why it's compatible with server-client

2. **Then:** `SERVER_CLIENT_MODEL_ASSESSMENT.md` (in parent directory)
   - See detailed compatibility analysis
   - Understand minimal changes needed

3. **Next:** `CLIENT_SERVER_SEPARATION_PLAN.md` (this directory)
   - System-by-system refactoring plan
   - Code examples for each change

4. **Specific topics:**
   - NPCs: Read `NPC_MIGRATION_OPTIONS.md`
   - Implementation: Read `RAILS_ENGINE_MIGRATION_PLAN.md`

### For Starting Implementation

**Follow these steps:**

1. **Create Rails Engine** (Week 1)
   ```bash
   rails plugin new break_escape --mountable --database=postgresql
   ```

2. **Setup Database** (Week 2)
   - Copy migration commands from `RAILS_ENGINE_MIGRATION_PLAN.md`
   - Run all model generators
   - Customize migrations

3. **Move Assets** (Week 3-4)
   - Use bash script from `RAILS_ENGINE_MIGRATION_PLAN.md`
   - Test asset loading

4. **Refactor Room Loading** (Week 5)
   - Implement `GameDataAccess` from `CLIENT_SERVER_SEPARATION_PLAN.md`
   - Change `loadRoom()` to fetch from server
   - Test dual-mode operation

5. **Continue with Other Systems** (Week 6+)
   - Follow order in `CLIENT_SERVER_SEPARATION_PLAN.md`
   - Test each system before moving to next

---

## Key Architectural Decisions

### Decision 1: Hybrid NPC Approach

**Context:** Need to balance dialogue responsiveness with security

**Decision:** Load ink scripts client-side, validate actions server-side

**Rationale:**
- Instant dialogue (critical for UX)
- Secure actions (prevents cheating)
- Simple implementation (no ink engine on server)

**Trade-off:** Dialogue spoilers acceptable (low-impact)

---

### Decision 2: Data Access Abstraction

**Context:** Need gradual migration without breaking existing code

**Decision:** Create `GameDataAccess` class to abstract data source

**Benefits:**
- Toggle between local/server mode
- Refactor incrementally
- Test both modes
- Easy rollback

**Implementation:** See `CLIENT_SERVER_SEPARATION_PLAN.md` Phase 2

---

### Decision 3: Optimistic UI Updates

**Context:** Network latency could make game feel sluggish

**Decision:** Update UI immediately, validate with server, rollback if needed

**Benefits:**
- Game feels responsive
- Server remains authority
- Handles network errors gracefully

**Implementation:** See inventory and unlock systems in separation plan

---

### Decision 4: Rails Engine (not Rails App)

**Context:** Need to integrate with Hacktivity but also run standalone

**Decision:** Build as mountable Rails Engine

**Benefits:**
- Self-contained (own routes, controllers, models)
- Mountable in host apps
- Can run standalone for development
- Namespace isolation (no conflicts)

**Trade-offs:** More complex setup than plain Rails app

---

## Database Schema Overview

### Core Tables

```
scenarios
├─ rooms
│  └─ room_objects
├─ npcs
└─ game_instances (per user)
   ├─ player_state (position, unlocked rooms/objects)
   ├─ inventory_items
   └─ conversations (with NPCs)
```

### Key Relationships

- **User** (from Hacktivity) → has many **GameInstances**
- **Scenario** → has many **Rooms**, **NPCs**
- **Room** → has many **RoomObjects**
- **GameInstance** → has one **PlayerState**, many **InventoryItems**, many **Conversations**

**Full schema:** See Phase 3 in `RAILS_ENGINE_MIGRATION_PLAN.md`

---

## API Endpoints

### Game Management
- `GET /break_escape/games` - List scenarios
- `POST /break_escape/games` - Start new game
- `GET /break_escape/games/:id` - Play game
- `GET /break_escape/games/:id/bootstrap` - Get initial game data

### Game Play (API)
- `GET /break_escape/games/:id/api/rooms/:room_id` - Get room data
- `POST /break_escape/games/:id/api/unlock/:type/:id` - Unlock door/object
- `GET /break_escape/games/:id/api/containers/:id` - Get container contents
- `POST /break_escape/games/:id/api/containers/:id/take` - Take item from container
- `POST /break_escape/games/:id/api/inventory` - Add item to inventory
- `POST /break_escape/games/:id/api/inventory/use` - Use item

### NPCs
- `GET /break_escape/games/:id/api/npcs` - List accessible NPCs
- `GET /break_escape/games/:id/api/npcs/:npc_id/story` - Get NPC ink script
- `POST /break_escape/games/:id/api/npcs/:npc_id/message` - Send message to NPC
- `POST /break_escape/games/:id/api/npcs/:npc_id/validate_action` - Validate NPC action

**Full routes:** See Phase 7 in `RAILS_ENGINE_MIGRATION_PLAN.md`

---

## Testing Strategy

### Unit Tests
- Models (business logic, validations, relationships)
- Serializers (correct JSON output)
- Services (unlock validation, state management)

### Controller Tests
- API endpoints (authentication, authorization, responses)
- Game controllers (scenario selection, game creation)

### Integration Tests
- Complete game flow (start → play → unlock → complete)
- Multi-room navigation
- Inventory management across sessions
- NPC interactions

### Policy Tests (Pundit)
- User can only access own games
- Cannot access unearned content
- Proper authorization for all actions

**Test examples:** See Phase 11 in `RAILS_ENGINE_MIGRATION_PLAN.md`

---

## Risk Assessment & Mitigation

### High Risk: Network Latency

**Risk:** Game feels sluggish with server round-trips

**Mitigation:**
- ✅ Optimistic UI updates
- ✅ Aggressive caching
- ✅ Prefetch adjacent rooms
- ✅ Keep minigames client-side

**Acceptable latency:**
- Room loading: < 500ms
- Unlock validation: < 300ms
- Inventory sync: < 200ms

---

### Medium Risk: State Inconsistency

**Risk:** Client and server state diverge

**Mitigation:**
- ✅ Server is always source of truth
- ✅ Periodic reconciliation
- ✅ Rollback on server rejection
- ✅ Audit log of state changes

---

### Medium Risk: Offline Play

**Risk:** Game requires network connection

**Mitigation:**
- ✅ Queue operations when offline
- ✅ Sync when reconnected
- ✅ Cache unlocked content
- ✅ Graceful error messages

---

### Low Risk: Cheating

**Risk:** Players manipulate client-side state

**Mitigation:**
- ✅ Server validates all critical actions
- ✅ Encrypted lock requirements
- ✅ Metrics-based anti-cheat
- ✅ Rate limiting

---

## Timeline Summary

### Phase 1: Preparation (Week 1-4)
- Setup Rails engine
- Create database schema
- Move assets
- Setup testing

### Phase 2: Core Systems (Week 5-10)
- Room loading
- Unlock system
- Inventory management
- Container system

### Phase 3: NPCs & Polish (Week 11-16)
- NPC system
- Views and UI
- Integration with Hacktivity
- Data migration

### Phase 4: Testing & Deployment (Week 17-20)
- Comprehensive testing
- Performance optimization
- Security audit
- Production deployment

**Total: 18-20 weeks (4-5 months)**

---

## Success Metrics

### Technical
- [ ] All tests passing
- [ ] p95 API latency < 500ms
- [ ] Database query time < 50ms
- [ ] Cache hit rate > 80%
- [ ] 99.9% uptime

### Security
- [ ] No solutions visible in client
- [ ] All critical actions validated server-side
- [ ] No bypass exploits found in audit
- [ ] Proper authorization on all endpoints

### UX
- [ ] Game feels responsive (no noticeable lag)
- [ ] Offline mode handles errors gracefully
- [ ] Loading indicators show progress
- [ ] State syncs transparently

### Integration
- [ ] Mounts successfully in Hacktivity
- [ ] Uses Hacktivity's Devise authentication
- [ ] Per-user scenarios work correctly
- [ ] Can also run standalone

---

## Next Steps

### Immediate Actions

1. **Review Planning Documents**
   - Read all three docs in this directory
   - Review architecture comparison docs in parent directory
   - Discuss any concerns or questions

2. **Approve Approach**
   - Confirm hybrid NPC approach
   - Confirm Rails Engine architecture
   - Confirm timeline is acceptable

3. **Setup Development Environment**
   - Create Rails engine
   - Setup PostgreSQL database
   - Configure asset pipeline

4. **Start Phase 1**
   - Follow `RAILS_ENGINE_MIGRATION_PLAN.md`
   - Begin with engine skeleton
   - Setup CI/CD pipeline

---

## Resources

### Documentation
- [Rails Engines Guide](https://guides.rubyonrails.org/engines.html)
- [Pundit Authorization](https://github.com/varvet/pundit)
- [Phaser Game Framework](https://phaser.io/docs)
- [Ink Narrative Language](https://github.com/inkle/ink)

### BreakEscape Docs (in repo)
- `README_scenario_design.md` - Scenario JSON format
- `README_design.md` - Game design document
- `planning_notes/room-loading/README_ROOM_LOADING.md` - Room system
- `docs/NPC_INTEGRATION_GUIDE.md` - NPC system
- `docs/CONTAINER_MINIGAME_USAGE.md` - Container system

### Migration Docs (this directory)
- `NPC_MIGRATION_OPTIONS.md` - NPC approaches
- `CLIENT_SERVER_SEPARATION_PLAN.md` - Refactoring plan
- `RAILS_ENGINE_MIGRATION_PLAN.md` - Implementation guide

### Architecture Docs (parent directory)
- `ARCHITECTURE_COMPARISON.md` - Current vs future
- `SERVER_CLIENT_MODEL_ASSESSMENT.md` - Compatibility analysis

---

## Questions & Answers

### Q: Can we still run BreakEscape standalone?

**A:** Yes! The Rails Engine can run as a standalone application for development and testing. Just run `rails server` in the engine directory.

---

### Q: Will this break the current game?

**A:** No. We'll use a dual-mode approach during migration. The `GameDataAccess` abstraction allows toggling between local JSON and server API. Current game continues working until migration is complete.

---

### Q: How long until we can mount in Hacktivity?

**A:** Basic mounting possible after Week 8 (room loading + unlock system working). Full feature parity requires ~16 weeks.

---

### Q: What about existing scenario JSON files?

**A:** They'll be imported into the database using rake tasks (provided in the plan). The JSON format becomes the import format, not the runtime format.

---

### Q: Can scenarios be updated without code changes?

**A:** Yes! Once in the database, scenarios can be edited via Rails console or admin interface. No need to modify JSON files or redeploy.

---

### Q: What happens to ink scripts?

**A:** Stored in database as TEXT (JSON). Hybrid approach: loaded client-side at game start, actions validated server-side. See `NPC_MIGRATION_OPTIONS.md` for details.

---

### Q: Will this work with mobile devices?

**A:** The client-side code (Phaser) already works on mobile. The Rails Engine just provides the backend API. No changes needed for mobile support.

---

## Conclusion

This migration is **highly feasible** due to excellent architectural preparation:

✅ **Separation exists:** Tiled (visual) vs Scenario (logic)  
✅ **Hooks exist:** `loadRoom()` perfect for server integration  
✅ **Matching is deterministic:** TiledItemPool works identically  
✅ **Minimal changes needed:** Only data source changes  

**Estimated effort:** 18-20 weeks  
**Confidence level:** High (95%)  
**Risk level:** Low-Medium (well understood, mitigations in place)  

**Recommendation:** Proceed with migration following the phased approach in these documents.

---

## Document Version History

- **v1.0** (2025-11-01) - Initial comprehensive planning documents created
  - NPC Migration Options
  - Client-Server Separation Plan  
  - Rails Engine Migration Plan
  - This summary document

---

## Contact & Feedback

For questions about this migration plan, contact the development team or file an issue in the repository.

**Happy migrating! 🚀**




