Major Features:
- Multi-project governance with Rule Manager web UI
- Project Manager for organizing governance across projects
- Variable substitution system (${VAR_NAME} in rules)
- Claude.md analyzer for instruction extraction
- Rule quality scoring and optimization
Admin UI Components:
- /admin/rule-manager.html - Full-featured rule management interface
- /admin/project-manager.html - Multi-project administration
- /admin/claude-md-migrator.html - Import rules from Claude.md files
- Dashboard enhancements for governance analytics
Backend Implementation:
- Controllers: projects, rules, variables
- Models: Project, VariableValue, enhanced GovernanceRule
- Routes: /api/projects, /api/rules with full CRUD
- Services: ClaudeMdAnalyzer, RuleOptimizer, VariableSubstitution
- Utilities: mongoose helpers
Documentation:
- User guides for Rule Manager and Projects
- Complete API documentation (PROJECTS_API, RULES_API)
- Phase 3 planning and architecture diagrams
- Test results and error analysis
- Coding best practices summary
Testing & Scripts:
- Integration tests for projects API
- Unit tests for variable substitution
- Database migration scripts
- Seed data generation
- Test token generator
Key Capabilities:
✅ UNIVERSAL scope rules apply across all projects
✅ PROJECT_SPECIFIC rules override for individual projects
✅ Variable substitution per-project (e.g., ${DB_PORT} → 27017)
✅ Real-time validation and quality scoring
✅ Advanced filtering and search
✅ Import from existing Claude.md files
Technical Details:
- MongoDB-backed governance persistence
- RESTful API with Express
- JWT authentication for admin endpoints
- CSP-compliant frontend (no inline handlers)
- Responsive Tailwind UI
This implements Phase 3 architecture as documented in planning docs.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
12 KiB
Coding Best Practices - Governance Rules Summary
Created: 2025-10-11
Context: Lessons learned from Phase 2 Migration API validation error
Analysis Document: docs/analysis/PHASE_2_ERROR_ANALYSIS.md
Overview
Following the Phase 2 migration API validation error (source: 'claude_md_migration' is not a valid enum value), a comprehensive root cause analysis was conducted. This analysis identified 5 major categories of preventable errors:
- Schema-Code Mismatch - Controller code not aligned with database schema
- Magic Strings - Hardcoded string literals instead of constants
- Development Environment Cache - Stale model definitions after schema changes
- Insufficient Testing - No integration tests before declaring code complete
- Documentation Gaps - Enum values not centrally documented
Based on this analysis, 10 governance rules were created to prevent similar errors in future development.
Created Governance Rules
1. inst_021 - Centralized Constants for Enums
Quadrant: SYSTEM | Persistence: HIGH | Priority: 95
ALL database enum values MUST be defined in a centralized constants file
(src/constants/*.constants.js). Controllers and services MUST import constants,
NEVER use string literals for enum values.
Examples:
- ✅ GOOD:
source: GOVERNANCE_SOURCES.CLAUDE_MD_MIGRATION - ❌ BAD:
source: 'claude_md_migration'
Prevents: Schema-code mismatches, typos, refactoring errors
2. inst_022 - Pre-Save Validation
Quadrant: TACTICAL | Persistence: HIGH | Priority: 90
BEFORE saving any Mongoose model instance, code MUST validate enum field values
against the schema's allowed values. Use pre-save validation or explicit checks.
Examples:
- ✅ GOOD:
if (!ENUM_VALUES.includes(value)) throw new Error(...) - ❌ BAD: Directly calling
newModel.save()without validation
Prevents: Runtime database validation errors, silent failures
3. inst_023 - JSDoc Type Annotations
Quadrant: TACTICAL | Persistence: HIGH | Priority: 85
ALL functions that create or update database models MUST include JSDoc type
annotations specifying allowed enum values. Use @typedef for complex types.
Examples:
- ✅ GOOD:
@property {'user_instruction'|'framework_default'|'claude_md_migration'} source - ❌ BAD:
@property {string} source(too vague)
Prevents: IDE type checking catches enum mismatches at dev-time
4. inst_024 - Server Restart After Model Changes
Quadrant: OPERATIONAL | Persistence: HIGH | Priority: 80
AFTER modifying any Mongoose model schema (*.model.js files), developer MUST
restart the Node.js server to clear require() cache. Use nodemon for automatic restarts.
Examples:
- ✅ GOOD:
npm run dev(uses nodemon, auto-restarts) - ❌ BAD: Editing model and testing without restart
Prevents: Testing against stale cached models
5. inst_025 - Constants File Structure
Quadrant: TACTICAL | Persistence: HIGH | Priority: 85
WHEN creating constants files for enums, MUST export both:
(1) Named object with constants (e.g., GOVERNANCE_SOURCES),
(2) Array of values (e.g., GOVERNANCE_SOURCE_VALUES).
Array MUST be used in model schema enum definition.
Examples:
- ✅ GOOD:
module.exports = { GOVERNANCE_SOURCES, GOVERNANCE_SOURCE_VALUES } - ✅ GOOD: Model uses
enum: GOVERNANCE_SOURCE_VALUES
Prevents: Duplication of enum definitions
6. inst_026 - Clear Validation Error Messages
Quadrant: TACTICAL | Persistence: MEDIUM | Priority: 70
ALL validation errors from Mongoose MUST include the invalid value and list of
valid values in the error message. Use custom error messages with {VALUES} placeholder.
Examples:
- ✅ GOOD:
enum: { values: [...], message: '{VALUE} not valid. Must be: {VALUES}' } - ❌ BAD: Generic "Validation failed" with no context
Prevents: Lengthy debugging sessions, unclear errors
7. inst_027 - Integration Tests Before Completion
Quadrant: OPERATIONAL | Persistence: HIGH | Priority: 90
ALL new API endpoints MUST have integration tests that hit the real database
BEFORE marking the implementation complete. Test MUST include both success and failure cases.
Examples:
- ✅ GOOD:
tests/integration/migration.test.jswith database operations - ❌ BAD: Marking API complete without integration tests
Prevents: Production deployment of broken code
8. inst_028 - Schema Change Checklist
Quadrant: OPERATIONAL | Persistence: HIGH | Priority: 95
WHEN adding or modifying database schema enum fields, developer MUST:
(1) Update/create constants file,
(2) Update model to use constants,
(3) Write validation tests,
(4) Follow Schema Change Checklist in docs/developer/SCHEMA_CHANGE_CHECKLIST.md
Examples:
- ✅ GOOD: Updated constants, model, wrote tests
- ❌ BAD: Updated code without writing tests
Prevents: Forgotten steps in schema changes
9. inst_029 - Enum Documentation
Quadrant: OPERATIONAL | Persistence: MEDIUM | Priority: 75
ALL enum value additions or changes MUST be documented in docs/developer/ENUM_VALUES.md
with table showing value, constant name, and description. Include instructions for adding new values.
Examples:
- ✅ GOOD: Updated ENUM_VALUES.md table when adding
claude_md_migration - ❌ BAD: Adding enum value without documentation
Prevents: Developers inventing new values without checking existing ones
10. inst_030 - Test Before Declaring Complete
Quadrant: OPERATIONAL | Persistence: HIGH | Priority: 90
BEFORE declaring any code implementation 'complete', developer MUST run all relevant tests
and verify they pass. For database code, this MUST include integration tests with real database operations.
Examples:
- ✅ GOOD:
npm test && curl POST /api/endpoint(verify works) - ❌ BAD: Writing code and marking complete without testing
Prevents: Discovering errors during final testing phase instead of immediately
Rule Categories by Quadrant
SYSTEM (1 rule)
- inst_021: Centralized constants for enums
TACTICAL (4 rules)
- inst_022: Pre-save validation
- inst_023: JSDoc type annotations
- inst_025: Constants file structure
- inst_026: Clear validation error messages
OPERATIONAL (5 rules)
- inst_024: Server restart after model changes
- inst_027: Integration tests before completion
- inst_028: Schema change checklist
- inst_029: Enum documentation
- inst_030: Test before declaring complete
Rule Categories by Persistence
HIGH (8 rules)
- inst_021, inst_022, inst_023, inst_024, inst_025, inst_027, inst_028, inst_030
MEDIUM (2 rules)
- inst_026, inst_029
Implementation Checklist
When implementing these rules in a new project:
Phase 1: File Structure Setup
- Create
src/constants/directory - Create constants files for all enum types
- Export both named object and values array
- Update models to import constants
Phase 2: Code Quality
- Add JSDoc annotations to all database functions
- Add pre-save validation for enum fields
- Update error messages with {VALUES} placeholder
Phase 3: Development Environment
- Install nodemon:
npm install --save-dev nodemon - Add dev script:
"dev": "nodemon src/server.js" - Document restart requirements in README
Phase 4: Testing
- Write integration tests for all API endpoints
- Test success and failure cases
- Add test-before-complete to workflow
Phase 5: Documentation
- Create
docs/developer/ENUM_VALUES.md - Create
docs/developer/SCHEMA_CHANGE_CHECKLIST.md - Document all enum values with tables
- Add "To Add New Value" instructions
Real-World Application
Example: Adding New Enum Value
Scenario: Need to add new source type 'api_import' for rules imported from external API
Following the Rules:
- inst_021 - Update constants file:
// src/constants/governance.constants.js
const GOVERNANCE_SOURCES = {
USER_INSTRUCTION: 'user_instruction',
FRAMEWORK_DEFAULT: 'framework_default',
AUTOMATED: 'automated',
MIGRATION: 'migration',
CLAUDE_MD_MIGRATION: 'claude_md_migration',
API_IMPORT: 'api_import', // ✅ NEW
TEST: 'test'
};
- inst_028 - Follow checklist:
- ✅ Updated constants file
- ✅ Model already uses
GOVERNANCE_SOURCE_VALUES(auto-includes new value) - ✅ Write validation test
- inst_023 - Update JSDoc:
/**
* @property {'user_instruction'|'framework_default'|'automated'|'migration'|'claude_md_migration'|'api_import'|'test'} source
*/
- inst_027 - Write integration test:
it('should create rule with api_import source', async () => {
const rule = new GovernanceRule({
source: GOVERNANCE_SOURCES.API_IMPORT // ✅ Using constant
});
await expect(rule.save()).resolves.not.toThrow();
});
- inst_029 - Update documentation:
| `api_import` | `GOVERNANCE_SOURCES.API_IMPORT` | Imported from external API |
- inst_024 - Restart server:
npm run dev # Nodemon auto-restarts
- inst_030 - Test before declaring complete:
npm test # All tests pass
curl POST /api/endpoint # Verify endpoint works
Result: New enum value added safely with zero errors! 🎉
Prevention Effectiveness
Time Comparison
Without These Rules (Phase 2 actual experience):
- Writing code: 15 minutes
- Testing and discovering error: 5 minutes
- Debugging root cause: 15 minutes
- Fixing model: 2 minutes
- Discovering server cache issue: 10 minutes
- Restarting and re-testing: 3 minutes
- Total: ~50 minutes
With These Rules (estimated):
- Writing code with constants: 15 minutes
- Writing JSDoc annotations: 5 minutes
- Writing integration test: 10 minutes
- Running test (catches error immediately): 1 minute
- Total: ~31 minutes
Time Saved: 19 minutes per incident Error Rate: Near zero (caught by tests before deployment)
Error Prevention Matrix
| Error Type | Prevented By | How |
|---|---|---|
| Schema-Code Mismatch | inst_021, inst_022, inst_025 | Constants + validation |
| Magic Strings | inst_021, inst_023 | Centralized constants + types |
| Stale Cache | inst_024 | Auto-restart with nodemon |
| Missing Tests | inst_027, inst_030 | Required integration tests |
| Unclear Errors | inst_026 | Descriptive error messages |
| Forgotten Steps | inst_028 | Schema change checklist |
| Undocumented Enums | inst_029 | Mandatory documentation |
Metrics & Monitoring
Compliance Checks
Automated (CI/CD Pipeline):
# Check for magic strings in controllers
grep -r "'user_instruction'" src/controllers/ && exit 1
# Verify constants files exist
test -f src/constants/governance.constants.js || exit 1
# Check JSDoc coverage
npm run check-jsdoc || exit 1
# Run integration tests
npm run test:integration || exit 1
Manual Code Review:
- All new enum values have constants
- All database functions have JSDoc
- All API endpoints have integration tests
- ENUM_VALUES.md updated
Success Criteria
These rules are successful when:
- ✅ Zero schema-code mismatch errors in production
- ✅ All enum values defined in constants files
- ✅ 100% integration test coverage for API endpoints
- ✅ All database errors include helpful context
- ✅ Developer onboarding time reduced (clear documentation)
- ✅ Code review time reduced (self-checking code)
Related Documents
- Root Cause Analysis:
docs/analysis/PHASE_2_ERROR_ANALYSIS.md - Phase 2 Test Results:
docs/testing/PHASE_2_TEST_RESULTS.md - Schema Change Checklist:
docs/developer/SCHEMA_CHANGE_CHECKLIST.md(to be created) - Enum Values Reference:
docs/developer/ENUM_VALUES.md(to be created)
Conclusion
The Phase 2 migration API error was a blessing in disguise. It revealed systemic weaknesses in development practices that, if left unchecked, would have caused repeated errors.
By creating these 10 governance rules, we've transformed a debugging session into a permanent improvement to code quality and developer experience.
Prevention is cheaper than debugging.
Created By: Claude Code Assistant Date: 2025-10-11 Status: ✅ Active - All 10 rules enforced in tractatus_dev database