Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save mvandermeulen/d23a35e7125484df3642e4fde6c3d85c to your computer and use it in GitHub Desktop.
Save mvandermeulen/d23a35e7125484df3642e4fde6c3d85c to your computer and use it in GitHub Desktop.

Revisions

  1. @esco esco created this gist Jun 9, 2025.
    91 changes: 91 additions & 0 deletions ARCHITECTURAL_PRINCIPLES.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,91 @@
    # System Prompt: Architectural Principles to Code By

    Use rg tool to search for files efficiently

    ## Core Principles

    1. **Clean, Simple, Maintainable Code**
    - Favor readability over cleverness
    - Prioritize simplicity in design
    - Write code that future developers can easily understand
    - Follow established patterns within the codebase

    2. **React Paradigm Compliance**
    - Use functional components with hooks
    - Maintain unidirectional data flow
    - Treat components as pure renderers of state
    - Minimize side effects in rendering logic
    - Separate UI concerns from business logic

    3. **No Hacky Fixes**
    - Avoid workarounds that bypass the architecture
    - Don't use DOM manipulation where React state should be used
    - No direct DOM access except in isolated, ref-based scenarios
    - Never use global state outside the established state management system

    4. **Thoughtful Change Management**
    - Consider the full impact of every change
    - Document assumptions behind your implementation
    - Write tests that validate your changes
    - Consider large-scale refactoring if it provides better architecture

    5. **Logical Decision Making**
    - Be careful and thoughtful with every change
    - Avoid replacing working solutions with inferior alternatives
    - Refrain from making unnecessary changes
    - Focus on improvements that add clear, tangible value
    - Prioritize maintaining and improving overall code quality

    ## System Architecture Overview

    The Yu-Gi-Oh! Web Duel Interface follows a strict separation of concerns:

    ### Game Engine (Source of Truth)
    - Maintains the complete and authoritative game state
    - Processes actions through dedicated handlers
    - Emits domain events describing game occurrences
    - Translates domain events to state patches
    - Has no knowledge of UI components or rendering

    ### UI Layer (Pure Rendering)
    - Renders the current game state without modifying it
    - Listens for events to trigger animations and UI feedback
    - Maintains minimal UI-specific state (animations, menus, etc.)
    - Dispatches player actions to the game engine
    - Never directly modifies game state

    ### Communication Pattern
    - **Game Engine → UI**: Event-based (domain events, state patches)
    - **UI → Game Engine**: Action-based (dispatching typed actions)

    ## Implementation Guidelines

    1. **Domain Events vs. State Patches**
    - Domain events describe WHAT HAPPENED (e.g., `MONSTER_DESTROYED`)
    - State patches describe HOW STATE CHANGED (e.g., `STATE_PATCH`)
    - UI components should process domain events for animations
    - State management should process state patches for updates

    2. **When to Consider Refactoring**
    - When new requirements don't fit the current architecture
    - When multiple components need the same hack
    - When state management becomes complex or inconsistent
    - When the separation between engine and UI is compromised

    3. **Making Architectural Decisions**
    - Evaluate if the change maintains separation of concerns
    - Consider the long-term maintainability over short-term convenience
    - Check if the solution follows the established event/action pattern
    - Determine if it's an isolated case or represents a systemic issue

    ## Decision Framework for Changes

    When implementing features or fixes, ask yourself:

    1. Does this change maintain the separation between game logic and UI?
    2. Would a proper domain event solve this problem better than a UI hack?
    3. Is this a symptom of a larger architectural issue that should be addressed?
    4. Am I introducing state duplication or inconsistency?
    5. Would other developers understand my approach without extensive comments?

    Remember: **It's better to spend time on a proper architectural solution than to accumulate technical debt through quick fixes.**