# PRISM Best Practices This document consolidates best practices for the PRISM methodology for effective AI-driven development. ## Core PRISM Principles ### The PRISM Framework **P - Predictability** - Structured processes with measurement - Quality gates at each step - PSP (Personal Software Process) tracking - Clear acceptance criteria **R - Resilience** - Test-driven development (TDD) - Graceful error handling - Defensive programming - Comprehensive test coverage **I - Intentionality** - Clear, purposeful code - SOLID principles - Clean Code practices - Explicit over implicit **S - Sustainability** - Maintainable code - Documentation that doesn't go stale - Continuous improvement - Technical debt management **M - Maintainability** - Domain-driven design where applicable - Clear boundaries and interfaces - Expressive naming - Minimal coupling, high cohesion ## Guiding Principles ### 1. Lean Dev Agents **Minimize Context Overhead:** - Small files loaded on demand - Story contains all needed info - Never load PRDs/architecture unless directed - Keep `devLoadAlwaysFiles` minimal **Why:** Large context windows slow development and increase errors. Focused context improves quality. ### 2. Natural Language First **Markdown Over Code:** - Use plain English throughout - No code in core workflows - Instructions as prose, not programs - Leverage LLM natural language understanding **Why:** LLMs excel at natural language. Code-based workflows fight against their strengths. ### 3. Clear Role Separation **Each Agent Has Specific Expertise:** - Architect: System design - PM/PO: Requirements and stories - Dev: Implementation - QA: Quality and testing - SM: Epic decomposition and planning **Why:** Focused roles prevent scope creep and maintain quality. ## Architecture Best Practices ### DO: ✅ **Start with User Journeys** - Understand user needs before technology - Work backward from experience - Map critical paths ✅ **Document Decisions and Trade-offs** - Why this choice over alternatives? - What constraints drove decisions? - What are the risks? ✅ **Include Diagrams** - System architecture diagrams - Data flow diagrams - Deployment diagrams - Sequence diagrams for critical flows ✅ **Specify Non-Functional Requirements** - Performance targets - Security requirements - Scalability needs - Reliability expectations ✅ **Plan for Observability** - Logging strategy - Metrics and monitoring - Alerting thresholds - Debug capabilities ✅ **Choose Boring Technology Where Possible** - Proven, stable technologies for foundations - Exciting technology only where necessary - Consider team expertise ✅ **Design for Change** - Modular architecture - Clear interfaces - Loose coupling - Feature flags for rollback ### DON'T: ❌ **Over-engineer for Hypothetical Futures** - YAGNI (You Aren't Gonna Need It) - Build for current requirements - Make future changes easier, but don't implement them now ❌ **Choose Technology Based on Hype** - Evaluate objectively - Consider maturity and support - Match to team skills ❌ **Neglect Security and Performance** - Security must be architected in - Performance requirements drive design - Don't defer these concerns ❌ **Create Documentation That Goes Stale** - Living architecture docs - Keep with code where possible - Regular reviews and updates ❌ **Ignore Developer Experience** - Complex setups hurt productivity - Consider onboarding time - Optimize for daily workflows ## Story Creation Best Practices ### DO: ✅ **Define Clear, Testable Acceptance Criteria** ```markdown ✅ GOOD: - User can login with email and password - Invalid credentials show "Invalid email or password" error - Successful login redirects to dashboard ❌ BAD: - Login works correctly - Errors are handled - User can access the system ``` ✅ **Include Technical Context in Dev Notes** - Relevant architecture decisions - Integration points - Performance considerations - Security requirements ✅ **Break into Specific, Implementable Tasks** - Each task is atomic - Clear success criteria - Estimated in hours - Can be done in order ✅ **Size Appropriately (1-3 days)** - Not too large (>8 points = split it) - Not too small (<2 points = combine) - Can be completed in one development session ✅ **Document Dependencies Explicitly** - Technical dependencies (services, libraries) - Story dependencies (what must be done first) - External dependencies (APIs, third-party) ✅ **Link to Source Documents** - Reference PRD sections - Reference architecture docs - Reference Jira epics ✅ **Set Status to "Draft" Until Approved** - Requires user review - May need refinement - Not ready for development ### DON'T: ❌ **Create Vague or Ambiguous Stories** - "Improve performance" ← What does this mean? - "Fix bugs" ← Which ones? - "Update UI" ← Update how? ❌ **Skip Acceptance Criteria** - Every story needs measurable success - AC drives test design - AC enables validation ❌ **Make Stories Too Large** - >8 points is too large - Split along feature boundaries - Maintain logical cohesion ❌ **Forget Dependencies** - Hidden dependencies cause delays - Map all prerequisites - Note integration points ❌ **Mix Multiple Features in One Story** - One user need per story - Clear single purpose - Easier to test and validate ❌ **Approve Without Validation** - Run validation checklist - Ensure completeness - Verify testability ## Development Best Practices ### Test-Driven Development (TDD) **Red-Green-Refactor:** 1. **Red**: Write failing test first 2. **Green**: Implement minimal code to pass 3. **Refactor**: Improve code while keeping tests green **Benefits:** - Tests actually verify behavior (you saw them fail) - Better design (testable code is better code) - Confidence in changes - Living documentation **Example:** ``` 1. Write test: test_user_login_with_valid_credentials() 2. Run test → FAILS (no implementation) 3. Implement login functionality 4. Run test → PASSES 5. Refactor: Extract validation logic 6. Run test → Still PASSES ``` ### Clean Code Principles ✅ **Meaningful Names** ```python # ✅ GOOD def calculate_monthly_payment(principal, rate, term_months): return principal * rate / (1 - (1 + rate) ** -term_months) # ❌ BAD def calc(p, r, t): return p * r / (1 - (1 + r) ** -t) ``` ✅ **Small Functions** - One responsibility per function - Maximum 20-30 lines - Single level of abstraction ✅ **No Magic Numbers** ```python # ✅ GOOD MAX_RETRIES = 3 TIMEOUT_SECONDS = 30 # ❌ BAD if retries > 3: # What's 3? Why 3? time.sleep(30) # Why 30? ``` ✅ **Explicit Error Handling** ```python # ✅ GOOD try: result = api.call() except APIError as e: logger.error(f"API call failed: {e}") return fallback_response() # ❌ BAD try: result = api.call() except: pass ``` ### SOLID Principles **S - Single Responsibility Principle** - Class has one reason to change - Function does one thing - Module has cohesive purpose **O - Open/Closed Principle** - Open for extension - Closed for modification - Use composition and interfaces **L - Liskov Substitution Principle** - Subtypes must be substitutable for base types - Maintain contracts - Don't break expectations **I - Interface Segregation Principle** - Many specific interfaces > one general interface - Clients shouldn't depend on unused methods - Keep interfaces focused **D - Dependency Inversion Principle** - Depend on abstractions, not concretions - High-level modules don't depend on low-level - Both depend on abstractions ### Story Implementation ✅ **Update Story File Correctly** - ONLY update Dev Agent Record sections - Mark tasks complete when ALL tests pass - Update File List with every change - Document issues in Debug Log ✅ **Run Full Regression Before Completion** - All tests must pass - No skipped tests - Linting clean - Build successful ✅ **Track PSP Accurately** - Set Started timestamp when beginning - Set Completed when done - Calculate Actual Hours - Compare to estimates for improvement ### DON'T: ❌ **Modify Restricted Story Sections** - Don't change Story content - Don't change Acceptance Criteria - Don't change Testing approach - Only Dev Agent Record sections ❌ **Skip Tests or Validations** - Tests are not optional - Validations must pass - No "TODO: add tests later" ❌ **Mark Tasks Complete With Failing Tests** - Complete = ALL validations pass - Includes unit + integration + E2E - No exceptions ❌ **Load External Docs Without Direction** - Story has what you need - Don't load PRD "just in case" - Keep context minimal ❌ **Implement Without Understanding** - If unclear, ask user - Don't guess requirements - Better to HALT than implement wrong ## Testing Best Practices ### Test Level Selection **Unit Tests - Use For:** - Pure functions - Business logic - Calculations and algorithms - Validation rules - Data transformations **Integration Tests - Use For:** - Component interactions - Database operations - API endpoints - Service integrations - Message queue operations **E2E Tests - Use For:** - Critical user journeys - Cross-system workflows - Compliance requirements - Revenue-impacting flows ### Test Priorities **P0 - Critical (>90% coverage):** - Revenue-impacting features - Security paths - Data integrity operations - Compliance requirements - Authentication/authorization **P1 - High (Happy path + key errors):** - Core user journeys - Frequently used features - Complex business logic - Integration points **P2 - Medium (Happy path + basic errors):** - Secondary features - Admin functionality - Reporting and analytics **P3 - Low (Smoke tests):** - Rarely used features - Cosmetic improvements - Nice-to-have functionality ### Test Quality Standards ✅ **No Flaky Tests** - Tests must be deterministic - No random failures - Reproducible results ✅ **Dynamic Waiting** ```python # ✅ GOOD wait_for(lambda: element.is_visible(), timeout=5) # ❌ BAD time.sleep(5) # What if it takes 6 seconds? Or 2? ``` ✅ **Stateless and Parallel-Safe** - Tests don't depend on order - Can run in parallel - No shared state ✅ **Self-Cleaning Test Data** - Setup in test - Cleanup in test - No manual database resets ✅ **Explicit Assertions in Tests** ```python # ✅ GOOD def test_user_creation(): user = create_user("test@example.com") assert user.email == "test@example.com" assert user.is_active is True # ❌ BAD def test_user_creation(): user = create_user("test@example.com") verify_user(user) # Assertion hidden in helper ``` ### Test Anti-Patterns ❌ **Testing Mock Behavior** - Test real code, not mocks - Mocks should simulate real behavior - Integration tests often better than heavily mocked unit tests ❌ **Production Pollution** - No test-only methods in production code - No test-specific conditionals - Keep test code separate ❌ **Mocking Without Understanding** - Understand what you're mocking - Know why you're mocking it - Consider integration test instead ## Quality Assurance Best Practices ### Risk Assessment (Before Development) ✅ **Always Run for Brownfield** - Legacy code = high risk - Integration points = complexity - Use risk-profile task ✅ **Score by Probability × Impact** **Risk Score Formula**: Probability (1-9) × Impact (1-9) **Probability Factors:** - Code complexity (higher = more likely to have bugs) - Number of integration points (more = higher chance of issues) - Developer experience level (less experience = higher probability) - Time constraints (rushed = more bugs) - Technology maturity (new tech = higher risk) **Impact Factors:** - Number of users affected (more users = higher impact) - Revenue impact (money at stake) - Security implications (data breach potential) - Compliance requirements (legal/regulatory) - Business process disruption (operational impact) **Risk Score Interpretation:** - **1-9**: Low risk - Basic testing sufficient - **10-29**: Medium risk - Standard testing required - **30-54**: High risk - Comprehensive testing needed - **55+**: Critical risk - Extensive testing + design review **Gate Decisions by Risk Score:** - Score ≥9 on any single risk = FAIL gate (must address before proceeding) - Score ≥6 on multiple risks = CONCERNS gate (enhanced testing required) ✅ **Document Mitigation Strategies** - How to reduce risk (technical approaches) - What testing is needed (test coverage requirements) - What monitoring to add (observability needs) - Rollback procedures (safety nets) ### Test Design (Before Development) ✅ **Create Comprehensive Strategy** - Map all acceptance criteria - Choose appropriate test levels - Assign priorities (P0/P1/P2/P3) ✅ **Avoid Duplicate Coverage** - Unit for logic - Integration for interactions - E2E for journeys - Don't test same thing at multiple levels ✅ **Plan Regression Tests for Brownfield** - Existing functionality must still work - Test touchpoints with legacy - Validate backward compatibility ### Requirements Tracing (During Development) ✅ **Map Every AC to Tests** - Given-When-Then scenarios - Traceability matrix - Audit trail ✅ **Identify Coverage Gaps** - Missing test scenarios - Untested edge cases - Incomplete validation ### Review (After Development) ✅ **Comprehensive Analysis** - Code quality - Test coverage - Security concerns - Performance issues ✅ **Active Refactoring** - QA can suggest improvements - Not just finding problems - Collaborative quality ✅ **Advisory, Not Blocking** - PASS/CONCERNS/FAIL/WAIVED gates - Teams set their quality bar - Document trade-offs ### Quality Gate Decisions **PASS** ✅ - All criteria met, ready for production Criteria: - All acceptance criteria tested - Test coverage adequate for risk level - No critical or high severity issues - NFRs validated - Technical debt acceptable **CONCERNS** ⚠️ - Issues exist but not blocking When to use: - Minor issues that don't block release - Technical debt documented for future - Nice-to-have improvements identified - Low-risk issues with workarounds - Document clearly what concerns exist **FAIL** ❌ - Blocking issues must be fixed Blocking criteria: - Acceptance criteria not met - Critical/high severity bugs - Security vulnerabilities - Performance unacceptable - Missing required tests - Technical debt too high - Clear action items required **WAIVED** 🔓 - Issues acknowledged, explicitly waived When to use: - User accepts known issues - Conscious technical debt decision - Time constraints prioritized - Workarounds acceptable - Require explicit user approval with documentation ## Brownfield Best Practices ### Always Document First ✅ **Run document-project** - Even if you "know" the codebase - AI agents need context - Discover undocumented patterns ### Respect Existing Patterns ✅ **Match Current Style** - Coding conventions - Architectural patterns - Technology choices - Team preferences ### Plan for Gradual Rollout ✅ **Feature Flags** - Toggle new functionality - Enable rollback - Gradual user migration ✅ **Backwards Compatibility** - Don't break existing APIs - Support legacy consumers - Migration paths ✅ **Migration Scripts** - Data transformations - Schema updates - Rollback procedures ### Test Integration Thoroughly ✅ **Enhanced QA for Brownfield** - ALWAYS run risk assessment first - Design regression test strategy - Test all integration points - Validate performance unchanged **Critical Brownfield Sequence:** ``` 1. QA: *risk {story} # FIRST - before any dev 2. QA: *design {story} # Plan regression tests 3. Dev: Implement 4. QA: *trace {story} # Verify coverage 5. QA: *nfr {story} # Check performance 6. QA: *review {story} # Deep integration analysis ``` ## Process Best Practices ### Multiple Focused Tasks > One Branching Task **Why:** Keeps developer context minimal and focused ✅ **GOOD:** ``` - Task 1: Create User model - Task 2: Implement registration endpoint - Task 3: Add email validation - Task 4: Write integration tests ``` ❌ **BAD:** ``` - Task 1: Implement user registration - Create model - Add endpoint - Validate email - Write tests - Handle errors - Add logging - Document API ``` ### Reuse Templates ✅ **Use create-doc with Templates** - Maintain consistency - Proven structure - Embedded generation instructions ❌ **Don't Create Template Duplicates** - One template per document type - Customize through prompts, not duplication ### Progressive Loading ✅ **Load On-Demand** - Don't load everything at activation - Load when command executed - Keep context focused ❌ **Don't Front-Load Context** - Overwhelming context window - Slower processing - More errors ### Human-in-the-Loop ✅ **Critical Checkpoints** - PRD/Architecture: User reviews before proceeding - Story drafts: User approves before dev - QA gates: User decides on CONCERNS/WAIVED ❌ **Don't Blindly Proceed** - Ambiguous requirements → HALT and ask - Risky changes → Get approval - Quality concerns → Communicate ## Anti-Patterns to Avoid ### Development Anti-Patterns ❌ **"I'll Add Tests Later"** - Tests are never added - Code becomes untestable - TDD prevents this ❌ **"Just Ship It"** - Skipping quality gates - Incomplete testing - Technical debt accumulates ❌ **"It Works On My Machine"** - Environment-specific behavior - Not reproducible - Integration issues ❌ **"We'll Refactor It Later"** - Later never comes - Code degrades - Costs compound ### Testing Anti-Patterns ❌ **Testing Implementation Instead of Behavior** ```python # ❌ BAD - Testing implementation assert user_service._hash_password.called # ✅ GOOD - Testing behavior assert user_service.authenticate(email, password) is True ``` ❌ **Sleeping Instead of Waiting** ```javascript // ❌ BAD await sleep(5000); expect(element).toBeVisible(); // ✅ GOOD await waitFor(() => expect(element).toBeVisible()); ``` ❌ **Shared Test State** ```python # ❌ BAD class TestUser: user = None # Shared across tests! def test_create_user(self): self.user = User.create() def test_user_login(self): # Depends on test_create_user running first! self.user.login() # ✅ GOOD class TestUser: def test_create_user(self): user = User.create() assert user.id is not None def test_user_login(self): user = User.create() # Independent! assert user.login() is True ``` ### Process Anti-Patterns ❌ **Skipping Risk Assessment on Brownfield** - Hidden dependencies - Integration failures - Regression bugs ❌ **Approval Without Validation** - Incomplete stories - Vague requirements - Downstream failures ❌ **Loading Context "Just In Case"** - Bloated context window - Slower processing - More errors ❌ **Ignoring Quality Gates** - Accumulating technical debt - Production issues - Team frustration ## Summary: The Path to Excellence ### For Architects: 1. Start with user needs 2. Choose pragmatic technology 3. Document decisions and trade-offs 4. Design for change 5. Plan observability from the start ### For Product Owners: 1. Clear, testable acceptance criteria 2. Appropriate story sizing (1-3 days) 3. Explicit dependencies 4. Technical context for developers 5. Validation before approval ### For Developers: 1. TDD - tests first, always 2. Clean Code and SOLID principles 3. Update only authorized story sections 4. Full regression before completion 5. Keep context lean and focused ### For QA: 1. Risk assessment before development (especially brownfield) 2. Test design with appropriate levels and priorities 3. Requirements traceability 4. Advisory gates, not blocking 5. Comprehensive review with active refactoring ### For Everyone: 1. Follow PRISM principles (Predictability, Resilience, Intentionality, Sustainability, Maintainability) 2. Lean dev agents, natural language first, clear roles 3. Progressive loading, human-in-the-loop 4. Quality is everyone's responsibility 5. Continuous improvement through measurement --- **Last Updated**: 2025-10-22