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>
22 KiB
Phase 3: Project Context Awareness - Implementation Plan
Phase: 3 of Multi-Project Governance Implementation Status: PLANNING Dependencies: Phase 1 (Rule Manager) ✅, Phase 2 (AI Optimizer) ✅ Estimated Duration: 3-4 sessions
Executive Summary
Phase 3 implements project-aware governance, enabling the Tractatus system to manage rules across multiple projects with context-specific variable substitution. This transforms the system from single-project to multi-project capable.
Key Capabilities
- Project Registry - Store and manage multiple projects
- Variable Substitution - Replace
${VAR_NAME}with project-specific values - Context-Aware Rule Display - Show rules with values for current project
- Project Switching - UI for selecting active project context
- Variable Value Management - CRUD for project-specific variable values
Problem Statement
Current Limitations
From existing codebase analysis:
The current rule system supports:
- ✅
scope: 'UNIVERSAL'vs'PROJECT_SPECIFIC' - ✅
applicableProjects: ['tractatus', 'family-history'] - ✅
variables: ['DB_TYPE', 'DB_PORT']
But lacks:
- ❌ Project metadata storage (name, description, tech stack)
- ❌ Variable value storage per project
- ❌ Runtime variable substitution
- ❌ UI for project selection
- ❌ UI for variable value editing
Use Case Example
Rule: "MongoDB port is 27017. ${DB_TYPE} database MUST be named ${DB_NAME} in ${ENVIRONMENT}."
Variables: DB_TYPE, DB_NAME, ENVIRONMENT
Project: tractatus
DB_TYPE= "MongoDB"DB_NAME= "tractatus_dev"ENVIRONMENT= "development"
Rendered: "MongoDB port is 27017. MongoDB database MUST be named tractatus_dev in development."
Project: family-history
DB_TYPE= "MongoDB"DB_NAME= "family_history"ENVIRONMENT= "production"
Rendered: "MongoDB port is 27017. MongoDB database MUST be named family_history in production."
Architecture Overview
Data Model
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Project │ │ GovernanceRule │ │ VariableValue │
├─────────────────┤ ├──────────────────┤ ├─────────────────┤
│ id (PK) │◄────────│ applicableProjects│◄────────│ projectId (FK) │
│ name │ │ variables[] │ │ variableName │
│ description │ │ scope │ │ value │
│ techStack │ │ text (template) │ │ description │
│ repositoryUrl │ │ │ │ category │
│ active │ │ │ │ │
│ metadata │ │ │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Variable Substitution Flow
1. User selects project: "tractatus"
└─> Frontend stores project ID in session/localStorage
2. Frontend requests rules for project
└─> GET /api/admin/rules?project=tractatus
3. Backend finds applicable rules
└─> Rules with scope=UNIVERSAL OR applicableProjects includes "tractatus"
4. Backend substitutes variables
└─> For each rule with variables[], lookup values for project "tractatus"
└─> Replace ${VAR_NAME} with actual value
└─> Return rendered text + original template
5. Frontend displays rendered rules
└─> Shows final text with substituted values
└─> Provides "Edit Variables" option
Phase 3 Tasks Breakdown
3.1 Backend: Project Model & API
3.1.1 Create Project Model
File: src/models/Project.model.js
Schema:
{
id: String (unique, e.g., 'tractatus', 'family-history'),
name: String (e.g., 'Tractatus Framework'),
description: String,
techStack: {
language: String (e.g., 'JavaScript'),
framework: String (e.g., 'Node.js/Express'),
database: String (e.g., 'MongoDB'),
frontend: String (e.g., 'Vanilla JS')
},
repositoryUrl: String,
active: Boolean,
metadata: {
defaultBranch: String,
environment: String (dev/staging/prod),
lastSynced: Date
},
createdAt: Date,
updatedAt: Date
}
Indexes:
id(unique)activename
3.1.2 Create VariableValue Model
File: src/models/VariableValue.model.js
Schema:
{
projectId: String (FK to Project.id),
variableName: String (e.g., 'DB_TYPE'),
value: String (e.g., 'MongoDB'),
description: String (what this variable represents),
category: String (database/security/config/path/url),
dataType: String (string/number/boolean/path/url),
validationRules: {
required: Boolean,
pattern: String (regex),
minLength: Number,
maxLength: Number
},
createdAt: Date,
updatedAt: Date
}
Indexes:
projectId, variableName(compound unique)projectIdvariableName
3.1.3 Create Project API Endpoints
File: src/controllers/projects.controller.js
Endpoints:
-
GET /api/admin/projects
- List all projects
- Filter:
?active=true - Response:
{ projects: [...], total: N }
-
GET /api/admin/projects/:id
- Get single project with all variable values
- Response:
{ project: {...}, variables: [...] }
-
POST /api/admin/projects
- Create new project
- Body:
{ id, name, description, techStack, ... } - Validation: Unique ID, required fields
-
PUT /api/admin/projects/:id
- Update project metadata
- Body:
{ name, description, ... }
-
DELETE /api/admin/projects/:id
- Soft delete (set active=false)
- Cascade: Mark associated variable values as inactive
3.1.4 Create Variable API Endpoints
File: src/controllers/variables.controller.js
Endpoints:
-
GET /api/admin/projects/:projectId/variables
- Get all variables for project
- Response:
{ variables: [...], total: N }
-
GET /api/admin/variables/global
- Get all unique variable names across all rules
- Response:
{ variables: ['DB_TYPE', 'DB_NAME', ...] }
-
POST /api/admin/projects/:projectId/variables
- Create/update variable value for project
- Body:
{ variableName, value, description, category } - Upsert logic: Update if exists, create if not
-
PUT /api/admin/projects/:projectId/variables/:variableName
- Update variable value
- Body:
{ value, description, category }
-
DELETE /api/admin/projects/:projectId/variables/:variableName
- Delete variable value
- Soft delete or hard delete (TBD)
3.1.5 Enhance Rules API for Context
File: src/controllers/rules.controller.js (modify existing)
Enhanced Endpoints:
- GET /api/admin/rules?project=:projectId
- Filter rules by project
- Logic:
scope=UNIVERSAL OR applicableProjects includes projectId - Substitute variables with project-specific values
- Return both
text(template) andrenderedText(substituted)
Response Format:
{
"success": true,
"rules": [
{
"id": "inst_019",
"text": "MongoDB port is 27017. ${DB_TYPE} database MUST be named ${DB_NAME}.",
"renderedText": "MongoDB port is 27017. MongoDB database MUST be named tractatus_dev.",
"variables": [
{"name": "DB_TYPE", "value": "MongoDB"},
{"name": "DB_NAME", "value": "tractatus_dev"}
],
"scope": "UNIVERSAL",
"applicableProjects": ["*"]
}
]
}
3.1.6 Create Variable Substitution Service
File: src/services/VariableSubstitution.service.js
Methods:
class VariableSubstitutionService {
/**
* Substitute variables in rule text for specific project
* @param {string} ruleText - Template text with ${VAR} placeholders
* @param {string} projectId - Project ID
* @returns {Promise<{renderedText: string, variables: Array}>}
*/
async substituteVariables(ruleText, projectId) {
// 1. Extract all ${VAR_NAME} from text
// 2. Lookup values for projectId
// 3. Replace placeholders with values
// 4. Return rendered text + metadata
}
/**
* Extract variable names from text
* @param {string} text - Text with ${VAR} placeholders
* @returns {Array<string>} - Variable names
*/
extractVariables(text) {
const regex = /\$\{([A-Z_]+)\}/g;
const matches = [...text.matchAll(regex)];
return [...new Set(matches.map(m => m[1]))];
}
/**
* Get all unique variables across all rules
* @returns {Promise<Array<{name: string, usageCount: number}>>}
*/
async getAllVariables() {
// Aggregate across all rules
// Return unique variable names with usage count
}
/**
* Validate variable values for project
* @param {string} projectId
* @returns {Promise<{complete: boolean, missing: Array<string>}>}
*/
async validateProjectVariables(projectId) {
// Find all rules for project
// Extract required variables
// Check if all have values
// Return missing variables
}
}
3.2 Frontend: Project Management UI
3.2.1 Create Project Manager Page
File: public/admin/project-manager.html
Features:
- Table listing all projects
- Columns: Name, ID, Tech Stack, Status, Actions
- Filter: Active/Inactive
- Search: By name or ID
- Actions: View, Edit, Delete
- "Add Project" button
Layout:
┌────────────────────────────────────────────────────────┐
│ Project Manager [+ Add Project]│
├────────────────────────────────────────────────────────┤
│ [Search...] [Filter: All ▼] │
├────────────────────────────────────────────────────────┤
│ Name ID Tech Stack Status ⚙️ │
│ Tractatus tractatus Node/Mongo Active ⋮ │
│ Family History family-hist Node/Mongo Active ⋮ │
└────────────────────────────────────────────────────────┘
3.2.2 Create Project Editor Component
File: public/js/admin/project-editor.js
Features:
- Form for project metadata (name, description, tech stack)
- Variable values editor (table)
- Variable discovery (scan rules for ${VAR})
- Validation (required fields, unique ID)
- Save/Cancel actions
Variable Values Table:
┌────────────────────────────────────────────────────────┐
│ Variable Values for: Tractatus │
├────────────────────────────────────────────────────────┤
│ Variable Value Category Actions │
│ DB_TYPE MongoDB database [Edit] │
│ DB_NAME tractatus_dev database [Edit] │
│ ENVIRONMENT development config [Edit] │
│ [+ Add Variable] │
└────────────────────────────────────────────────────────┘
3.2.3 Create Project Selector Component
File: public/js/components/project-selector.js
Features:
- Dropdown in navbar (all admin pages)
- Shows current project
- Lists all active projects
- Stores selection in localStorage
- Emits event on change (for other components to react)
UI Location: Top navbar, next to logo
┌────────────────────────────────────────────────────────┐
│ Tractatus Admin [Project: Tractatus ▼] [Logout] │
└────────────────────────────────────────────────────────┘
3.2.4 Enhance Rule Manager for Context
File: public/js/admin/rule-manager.js (modify existing)
Enhancements:
- Add project filter dropdown
- Show rendered text (with substituted variables)
- Show template text in edit mode
- Display variable values used
- Highlight rules that apply to current project
Rule Card Enhancement:
┌────────────────────────────────────────────────────────┐
│ inst_019 | SYSTEM | HIGH │
│ │
│ Rendered Text (for Tractatus): │
│ MongoDB port is 27017. MongoDB database MUST be │
│ named tractatus_dev in development. │
│ │
│ Template: ...${DB_TYPE}...${DB_NAME}...${ENVIRONMENT} │
│ Variables: DB_TYPE=MongoDB, DB_NAME=tractatus_dev │
│ │
│ [Edit] [Deactivate] [View Details] │
└────────────────────────────────────────────────────────┘
3.2.5 Create Variable Editor Modal
File: public/js/admin/variable-editor.js
Features:
- Modal for editing single variable value
- Field: Variable name (read-only if editing)
- Field: Value (input)
- Field: Description (textarea)
- Field: Category (dropdown)
- Validation: Required fields, data type validation
- Preview: Show how this affects related rules
3.3 Integration & Testing
3.3.1 Database Seeding
File: scripts/seed-projects.js
Seed Data:
-
Project: tractatus
- Variables: DB_TYPE, DB_NAME, ENVIRONMENT, APP_PORT
-
Project: family-history
- Variables: DB_TYPE, DB_NAME, ENVIRONMENT, S3_BUCKET
3.3.2 API Integration Tests
File: tests/integration/projects.test.js
Test Cases:
- ✅ Create project
- ✅ List projects
- ✅ Update project
- ✅ Delete project (soft delete)
- ✅ Add variable value
- ✅ Update variable value
- ✅ Get rules with variable substitution
- ✅ Validate project variables (missing detection)
3.3.3 Frontend Integration Tests
File: tests/frontend/project-context.test.js
Test Cases:
- ✅ Project selector displays projects
- ✅ Switching project updates localStorage
- ✅ Rule manager shows context-filtered rules
- ✅ Variable editor saves values
- ✅ Rendered text updates when variables change
3.4 Documentation
3.4.1 API Documentation
File: docs/api/PROJECTS_API.md
- Complete endpoint documentation
- Request/response examples
- Variable substitution algorithm
- Data models
3.4.2 User Guide
File: docs/USER_GUIDE_PROJECTS.md
- How to create projects
- How to manage variable values
- How to view context-aware rules
- Troubleshooting variable substitution
Task Priority & Sequence
Session 1: Backend Foundation
- ✅ Create Project model
- ✅ Create VariableValue model
- ✅ Create VariableSubstitution service
- ✅ Write unit tests for substitution logic
Session 2: Backend APIs
- ✅ Create projects controller + routes
- ✅ Create variables controller + routes
- ✅ Enhance rules controller for context
- ✅ Write API integration tests
Session 3: Frontend UI
- ✅ Create project-manager.html
- ✅ Create project-editor.js
- ✅ Create project-selector component
- ✅ Enhance rule-manager for context
Session 4: Testing & Documentation
- ✅ Seed database with test projects
- ✅ Frontend integration testing
- ✅ Write API documentation
- ✅ Write user guide
Success Criteria
Functional
- ✅ Can create/edit/delete projects
- ✅ Can set variable values per project
- ✅ Rules display with substituted values for selected project
- ✅ Variable substitution works correctly
- ✅ Missing variables are detected and reported
Technical
- ✅ All API endpoints tested (integration tests)
- ✅ Frontend components functional
- ✅ Variable substitution performance < 50ms
- ✅ Database indexes optimized for queries
User Experience
- ✅ Intuitive project switching
- ✅ Clear visual distinction: template vs rendered text
- ✅ Easy variable value editing
- ✅ Helpful error messages for missing variables
Technical Considerations
Variable Substitution Algorithm
Input:
{
text: "MongoDB port is 27017. ${DB_TYPE} database MUST be named ${DB_NAME}.",
projectId: "tractatus"
}
Process:
- Extract variables:
['DB_TYPE', 'DB_NAME'] - Query:
SELECT * FROM variableValues WHERE projectId='tractatus' AND variableName IN ('DB_TYPE', 'DB_NAME') - Build map:
{ DB_TYPE: 'MongoDB', DB_NAME: 'tractatus_dev' } - Replace:
text.replace(/\$\{([A-Z_]+)\}/g, (match, name) => map[name] || match) - Return:
{ renderedText: "...", variables: [...] }
Edge Cases:
- ❓ Variable not defined for project → Keep placeholder
${VAR}or show error? - ❓ Circular dependencies → Not possible with simple substitution
- ❓ Nested variables
${${VAR}}→ Not supported - ❓ Case sensitivity → Variables MUST be UPPER_SNAKE_CASE
Performance Optimization
Caching Strategy:
- Cache variable values per project in Redis (TTL: 5 minutes)
- Invalidate cache when variable values updated
- Cache rendered text per rule+project combination
Database Queries:
- Compound index on
(projectId, variableName)for fast lookups - Batch fetch all variables for project in single query
- Use MongoDB aggregation for efficient rule filtering
Security Considerations
Variable Value Validation:
- Sanitize input (prevent XSS in variable values)
- Validate data types (string, number, boolean)
- Pattern matching for paths, URLs
- Max length constraints
Access Control:
- Only authenticated admins can manage projects
- Project-level permissions (future: different admins for different projects)
- Audit log for variable value changes
Migration Strategy
Existing Rules
- Rules already have
scope,applicableProjects,variablesfields - No schema changes needed
- Backward compatible: Rules without variables work as-is
Existing Data
- Create default "tractatus" project
- Migrate existing variable placeholders to VariableValue records
- Scan all rules for
${VAR}patterns - Auto-create variable value entries (value = placeholder name initially)
Future Enhancements (Phase 4+)
Advanced Features
- Variable inheritance (global → project-specific overrides)
- Variable templates (reusable sets of variables)
- Variable validation rules (regex, enums, ranges)
- Variable dependencies (VAR_A requires VAR_B)
- Version control for variable values (track changes over time)
- Import/export variable configurations
Integration Features
- Auto-discovery of variables from git repositories
- Sync with .env files
- Integration with secret management (Vault, AWS Secrets Manager)
- Variable value encryption for sensitive data
Risks & Mitigation
Risk 1: Variable Namespace Collisions
Risk: Two projects use same variable name for different purposes
Mitigation: Namespacing (e.g., TRACTATUS_DB_NAME vs FH_DB_NAME) or project-scoped lookups (already scoped)
Risk 2: Performance with Many Variables
Risk: Substitution slow with hundreds of variables Mitigation: Caching, batch queries, indexing
Risk 3: Missing Variable Values
Risk: Users forget to set values, rules show ${VAR}
Mitigation: Validation service, UI warnings, required variable detection
Dependencies
External Libraries
- None (use existing stack)
Internal Dependencies
- Phase 1: Rule Manager UI ✅
- Phase 2: AI Optimizer ✅
- GovernanceRule model (already supports variables) ✅
Estimated Effort
Total: 12-16 hours (3-4 sessions)
| Task Category | Hours |
|---|---|
| Backend models & services | 3-4 |
| Backend APIs & controllers | 3-4 |
| Frontend components | 4-5 |
| Testing | 2-3 |
| Documentation | 1-2 |
Deliverables
Code
- Project model + migrations
- VariableValue model
- VariableSubstitution service
- Projects controller + routes
- Variables controller + routes
- Enhanced rules controller
- Project manager UI
- Project selector component
- Enhanced rule manager
Tests
- Unit tests (models, services)
- Integration tests (APIs)
- Frontend tests
Documentation
- API reference
- User guide
- Developer guide
- Migration guide
Next Steps
- Review & Approve Plan - Get user confirmation
- Session 1: Start Backend - Create models and services
- Iterate & Test - Build incrementally with testing
- Deploy & Validate - Seed data and verify functionality
Plan Created: 2025-10-11 Status: AWAITING APPROVAL Next: Begin Session 1 - Backend Foundation