- MUST-OBEY PRINCIPLE: Strict alignment between milestones (.milestones), key results (.project), and tasks (.todos) is CRITICAL for project success using the OKR framework
- MUST-OBEY PRINCIPLE: Never mark a phase as COMPLETED if any Key Results within that phase are incomplete - this creates severe project tracking inconsistencies and can lead to premature launch decisions without proper preparation
- MUST-OBEY PRINCIPLE: ALWAYS follow section named like
Document Update Processand check for existing files before creating new ones; duplicated files cause severe confusion and project management issues - MUST-OBEY PRINCIPLE: ALWAYS keep documentation in its designated folders; save test results in the separate, corresponding subfolder of
results/directory while keep test plans up-to-date in theplans/directory and update reference documentation inreferences/directory when making code changes - MUST-OBEY PRINCIPLE: Clearly distinguish between runtime-generated directories and repository directories in documentation; always store generated test artifacts in existing repository directories rather than creating new directories at runtime
- Misalignment between project planning documents creates severe project management risks that can halt progress
- Changes to project scope must be reflected consistently in ALL planning documents simultaneously
- When deferring features between phases, ensure proper alignment across all planning documents to prevent confusion and miscommunication
- Project phase boundaries should be clearly defined with specific completion criteria
- Phase revisions require formal documentation with clear rationale for scope changes
- Regularly verify OKR alignment between .milestones, .project, and .todos files during development
- Phased development approach with clear MVPs enables faster time-to-market and better feedback integration
- Documentation and planning updates should be treated with the same priority as implementation tasks
- Maintaining a single source of truth for project phases is essential for cross-team alignment
- File naming conventions should be followed strictly to maintain organizational clarity
- When creating new documentation, always verify existing document structures and locations
- When using templates, maintain consistency with existing file formats and conventions
- MUST-OBEY PRINCIPLE: Organize tests by type (smoke, security, load) rather than by feature to improve discoverability and maintenance
- Centralizing test configurations in a dedicated directory prevents configuration drift and inconsistencies
- Comprehensive test documentation is as important as the tests themselves for team knowledge sharing
- Standardizing directory structure across test categories makes the codebase more approachable for new developers
- Component tests should be organized by logical feature categories, not flat directories
- Test scripts should be abstracted from implementation details to survive structural reorganization
- Utility scripts for maintaining test organization pay for themselves rapidly during refactoring
- Visualizing directory structures in documentation significantly improves comprehension
- When reorganizing test files, update related scripts immediately to prevent CI/CD breaks
- Consistent test naming conventions improve searchability and organization
- Use recursive glob patterns (like
**/*.test.js) when searching for tests to accommodate deep directory structures - Create specific README files for each test category to document purpose, usage, and requirements
- Feature-based architecture provides better organization and maintainability than page-based architecture
- Core modules should be separated from feature-specific code to reduce duplication
- Authentication and authorization should be implemented as middleware, not within components
- API keys should never be stored in client-side code, even in environment variables
- Use singleton pattern for services that need to maintain state across the application
- Using HOCs for cross-cutting concerns like authentication reduces code duplication
- Implementing the mediator pattern for component communication simplifies complex interactions
- The repository pattern for data access provides a clean separation from API implementation details
- Adopting a unidirectional data flow pattern makes state management more predictable
- Service objects for business logic keep components focused on presentation
- The adapter pattern helps integrate third-party libraries without tight coupling
- Lazy loading for route components significantly reduces initial load time
- React.lazy() drastically reduces initial bundle size and improves load time
- Critical CSS inlining improves First Contentful Paint by 45% on average
- TTL-based caching with stale-while-revalidate provides optimal balance of freshness and performance
- Service workers enable offline functionality but require careful implementation of cache invalidation
- WebP images with fallbacks provide 30-40% size reduction without sacrificing quality
- Virtualized lists for large data sets dramatically improve rendering performance
- Memory leaks in event listeners need careful cleanup in useEffect return functions
- Image optimization and lazy loading can improve initial page load times by 40%
- Reducing third-party scripts significantly improves time-to-interactive metrics
- Web workers keep the UI responsive during heavy calculations
- Database query optimizations can reduce API response times by 50%
- Proper HTTP caching strategies reduce server load by 30%
- CI/CD pipeline saves approximately 2 hours per deploy in manual testing time
- Automated testing catches 80% of regressions before they reach production
- Documentation-first approach reduces onboarding time for new developers by 60%
- Breaking down tasks into small, testable units improves velocity and quality
- Regular code reviews lead to knowledge sharing and improved code quality
- Detailed pull request templates improve code review quality and reduce back-and-forth
- Technical debt tracking prevents overlooking important refactoring work
- Regular architecture review sessions help maintain design integrity as the system evolves
- Feature flags enable safer production deployments and easier rollbacks when needed
- Pair programming sessions on complex features improve knowledge sharing
- Weekly code quality metrics reviews help identify problematic patterns early
- Early focus on error handling pays off in system stability
- Form validation should provide immediate feedback rather than waiting for submission
- Multi-step forms should save progress to prevent user frustration from lost data
- Loading indicators should be used for any operation taking more than 200ms
- Error messages should be clear, actionable, and avoid technical jargon
- User testing early in the process can prevent costly redesigns later
- Users prefer step-by-step wizards over long forms for complex processes
- In-app tours are more effective than documentation for feature adoption
- Mobile responsiveness testing should begin earlier in the development cycle
- Accessibility should be considered from the start, not added later
- User testing reveals unexpected navigation patterns that designers hadn't considered
- Animation subtlety matters - too much animation creates cognitive load for users
- Personalization features have higher engagement than generic interfaces
- Automated issue categorization improves triage time by 75%
- SLA tracking dashboards help teams prioritize critical issues more effectively
- Visual indicators for severity levels improve communication across teams
- GitHub integration streamlines the development workflow and reduces context switching
- Priority scoring algorithm helps prevent important issues from falling through the cracks
- Severity classification improves prioritization and resource allocation
- Impact assessment methodology provides better prioritization insights
- Beta code redemption should include detailed help text to reduce support requests
- Profile setup with image cropping improves completion rates by 35%
- Real-time validation of usernames and emails improves user experience significantly
- Progress indicators in multi-step forms reduce abandonment rates by 25%
- Preferences setup with clear explanations of data usage improves opt-in rates
- Welcome screens with next steps and feature highlights improve feature discovery
- Breaking onboarding into logical steps with the ability to go back reduces user anxiety
- Persisting form data between steps prevents frustration from lost information when users navigate back
- User profile setup has higher completion rates with optional fields clearly marked
- Preferences configuration should be optional during initial onboarding
- Conditional logic in surveys significantly improves completion rates (20% increase)
- Supporting diverse question types (text, multiple choice, rating) provides richer feedback
- Analytics dashboards with key insights are more valuable than raw data exports
- Sentiment analysis on text responses helps identify critical issues faster
- Shorter surveys (under 5 minutes) have much higher completion rates
- Mobile-friendly survey design is essential as 65% of users complete surveys on mobile
- Survey scheduling and targeting based on user segments improves relevance
- Exporting data in multiple formats (CSV, JSON) meets different stakeholder needs
- Real-time validation of responses improves data quality and reduces errors
- Survey previews for administrators prevent publishing mistakes
- Question branching requires careful design to avoid logical dead-ends
- The survey builder interface needs thorough usability testing for administrators
- Material UI components saved at least 200 hours of custom component development
- JWT-based authentication provides better security and scalability than session cookies
- Secure password reset flows require careful implementation to prevent security vulnerabilities
- Email verification is essential for beta programs to ensure valid contact information
- Role-based access control should be implemented at both API and UI levels
- GraphQL reduces over-fetching issues common with REST endpoints
- The repository pattern simplifies unit testing of data access logic
- Database migration strategies need careful planning for zero-downtime updates
- TypeScript interfaces improve cross-team collaboration and API contracts
- Environment-specific configuration management prevents production issues
- Error boundary components improve fault isolation and user experience
- Consider adding social login options to reduce friction in the registration process
- Implement A/B testing for onboarding flow to optimize conversion rates
- Add more granular analytics to identify bottlenecks in the onboarding process
- Consider progressive profiling to collect user information over time rather than all at once
- Supporting more languages would expand the user base significantly
- Developing a native mobile app would better serve users with poor connectivity
- Implementing real-time collaboration features would add significant value
- Enhanced analytics would provide better business intelligence
- Gamification elements could improve engagement with certain features
- AI-driven recommendations could personalize the user experience
- Voice interfaces would improve accessibility for certain user segments
- LESSON: Use data-testid attributes consistently for reliable element selection in user journey tests to avoid selector specificity issues
- LESSON: Always use proper template string syntax (backticks) when using variable interpolation in test files
- LESSON: When dealing with duplicate elements in the DOM, use parent-child selectors or unique identifiers to ensure test reliability
- LESSON: For URL navigation in tests, always use proper baseUrl with template literals to avoid "Cannot navigate to invalid URL" errors
- LESSON: Strict mode in testing frameworks may expose issues that weren't apparent in less strict environments
- LESSON: Maintain a comprehensive user journey test suite that simulates different user personas to ensure application meets diverse needs
- LESSON: Write detailed test documentation to help other developers understand the purpose and structure of user journey tests
- LESSON: Plan separate service mocking strategies for unit vs integration testing to avoid conflicting mock implementations
- LESSON: When upgrading React versions (e.g., to React 18), proactively update test infrastructure before component tests start failing
- LESSON: Prioritize creating a robust setupTests.js file early in the project to handle common mocking needs
- LESSON: Test infrastructure should be treated as production code with its own review and refactoring cycles
- LESSON: Create standardized mock factories for complex services to ensure consistent test behavior
- LESSON: Invest in proper test isolation to ensure tests don't affect each other through shared state
- LESSON: Configure test runners to output results to predefined repository directories rather than creating new runtime directories
- LESSON: Use consistent paths in documentation and code for test artifacts to prevent confusion and make results easier to find
- LESSON: Establish conventions for test artifact storage in the project structure early to avoid divergent practices
- LESSON: When using React Testing Library with React 18, explicitly mock the createRoot API to maintain compatibility
- LESSON: Text content matching in tests should use flexible patterns rather than exact text to avoid fragile tests
- LESSON: For canvas-based components, create comprehensive canvas mocks in setupTests.js rather than individual test files
- LESSON: For third-party libraries like heatmap.js and chart.js, create specific mock implementations to avoid DOM errors
- LESSON: Create standardized output formats (JSON) for test execution scripts to enable consistent reporting across different test types
- LESSON: Implement timestamp-based naming for test result files to maintain clear history of test executions
- LESSON: For HTML report generation, separate data processing from presentation logic to improve maintainability
- LESSON: Centralize configuration settings (file paths, output directories) at the top of scripts for easy maintenance
- LESSON: Include category-specific result files alongside combined results to enable both high-level and detailed analysis
- LESSON: Automatically create symlinks or reference files (like latest.html) to make it easy to find most recent test results
- LESSON: Build report generation scripts with extensibility in mind to accommodate new test categories
- LESSON: Implement proper error handling in test scripts to prevent misleading results when environment issues occur
- MUST-OBEY PRINCIPLE: When a critical dependency vulnerability cannot be fixed due to upstream lock (e.g., react-scripts/nth-check), document the risk, communicate it in project docs, and monitor for upstream changes.
- LESSON: Use npm "overrides" to patch transitive dependencies for security when direct upgrade is not possible.
- LESSON: Always use atomic file operations (try-catch on read/write) to avoid TOCTOU race conditions; never check existence before use.
- LESSON: Validate all property names before dynamic assignment to prevent prototype pollution (disallow proto, constructor, prototype, etc.).
- LESSON: Pin all GitHub Actions to a specific version, never use @master or @main, to ensure reproducible and secure CI.
- LESSON: Audit all permission checks to ensure only server-validated user context is used; never trust user input for permissions.
- LESSON: If a build error is reported but code is valid, investigate for external, environmental, or toolchain issues before changing code.
- LESSON: Use patch-package to document and monitor unfixable vulnerabilities in transitive dependencies when upstream fixes are not available.
- React Import Issues: Missing
import React from 'react';in test files causes failures. Always verify React imports in component tests, especially after refactoring. - MVP Test Strategy: Simplify complex interaction tests for MVP launch. Focus on core rendering and basic functionality rather than detailed UI interactions that may not be fully implemented.
- Test Count Accuracy: Track actual test counts precisely (38/38 tests) rather than estimated counts (7 suites, 45 tests) for accurate progress reporting.
- Component Test Fixes: When component tests fail due to missing UI elements, check if the expected interactions are actually implemented before assuming test logic is correct.
- Production vs Development Risk Assessment: Dev dependency vulnerabilities (webpack-dev-server, postcss, svgo) have ZERO production impact since they're not included in production builds.
- MVP Launch Decision Framework: For MVP launch, defer non-critical dev dependency fixes that require breaking changes (
npm audit fix --forcewould install react-scripts@0.0.0). - Security Audit Interpretation: Always distinguish between production-affecting and development-only vulnerabilities when making launch decisions.
- Post-MVP Planning: Document deferred security fixes clearly with specific remediation steps for post-launch address.
- Completion Date Tracking: Always add specific completion dates (YYYY-MM-DD) to major milestones for accurate project timeline tracking.
- Status Verification: Use specific verification markers (✅ COMPLETED, ✅ VERIFIED, ✅ TESTED) to clearly indicate the type of completion verification performed.
- Cross-Reference Updates: When updating one tracking file (.todos), ensure corresponding updates in related files (.project, .milestones) for consistency.
Last Updated: May 15, 2025