18 KiB
Risk Assessment: Story 1.1 - Database Schema Extension
Document Type: Risk Profile Story: 1.1 - Database Schema Extension Date: 2026-01-15 Assessment Type: Brownfield Integration Risk Analysis Status: Complete
Executive Summary
This risk assessment analyzes the database schema extension for Story 1.1, which adds three new tables (institutions, cohorts, cohort_enrollments) to the existing DocuSeal codebase. The assessment identifies critical integration risks, data integrity concerns, and rollback complexities inherent in brownfield development.
Overall Risk Level: MEDIUM-HIGH Primary Concerns: Foreign key dependencies, existing table integration, rollback complexity
Risk Categories
1. Technical Risks
| Risk ID | Probability | Impact | Severity | Description |
|---|---|---|---|---|
| T-01 | High | High | CRITICAL | Foreign Key Constraint Failures Foreign keys to templates and submissions tables may fail if referenced records don't exist during migration or if existing data violates constraints. |
| T-02 | Medium | High | HIGH | Migration Rollback Complexity Rollback may fail due to foreign key dependencies or data integrity issues, requiring manual database intervention. |
| T-03 | Low | High | MEDIUM | Database Compatibility Issues Schema may not be compatible with all supported databases (PostgreSQL/MySQL/SQLite) due to JSONB usage or specific syntax. |
| T-04 | Medium | Medium | MEDIUM | Index Creation Performance Creating indexes on large existing tables may cause significant downtime or locking. |
| T-05 | Low | Medium | LOW | Schema Version Mismatch Migration timestamp conflicts with existing migrations in production. |
Mitigation Strategies:
- T-01: Add
ON DELETE CASCADEorON DELETE SET NULLto foreign keys; validate existing data before migration - T-02: Test rollback in staging environment; create backup before migration; use transaction wrapper
- T-03: Test migration on all three database types; use Rails 7+ compatible syntax
- T-04: Create indexes concurrently (PostgreSQL); schedule migration during low-traffic period
- T-05: Use unique timestamp prefix; verify migration order in production
2. Integration Risks
| Risk ID | Probability | Impact | Severity | Description |
|---|---|---|---|---|
| I-01 | HIGH | HIGH | CRITICAL | Template Reference Integritycohorts.template_id references templates.id. If templates are deleted or archived, foreign key constraint may prevent cohort creation or cause orphaned records. |
| I-02 | HIGH | HIGH | CRITICAL | Submission Reference Integritycohort_enrollments.submission_id references submissions.id. Existing DocuSeal workflows may delete submissions, breaking enrollment links. |
| I-03 | Medium | High | HIGH | Account Table Confusion PRD specifies single institutions table, but DocuSeal has accounts table. Risk of confusion or unintended cross-references. |
| I-04 | Medium | Medium | MEDIUM | Existing Query Performance Degradation New indexes or table locks may slow down existing DocuSeal queries (templates, submissions, submitters). |
| I-05 | Low | Medium | LOW | Active Storage Conflicts New tables may conflict with Active Storage naming conventions or attachment behaviors. |
Mitigation Strategies:
- I-01: Add
restrict_with_exceptionto prevent template deletion if cohorts exist; implement soft deletes on templates - I-02: Use
dependent: :restrict_with_exceptionon CohortEnrollment submission reference; ensure submission lifecycle is managed - I-03: Document clearly that
institutionsis independent ofaccounts; no foreign key relationship - I-04: Run EXPLAIN ANALYZE on critical queries; monitor query plans after migration
- I-05: Verify Active Storage table names don't conflict; use explicit table names if needed
3. Data Integrity Risks
| Risk ID | Probability | Impact | Severity | Description |
|---|---|---|---|---|
| D-01 | Medium | HIGH | HIGH | Unique Constraint Violationscohort_enrollments has unique constraints on [cohort_id, student_email] and [submission_id]. Existing data may violate these. |
| D-02 | Medium | High | HIGH | NOT NULL Constraint Failures Required fields ( institution_id, template_id, student_email) may receive NULL values during bulk operations. |
| D-03 | Low | High | MEDIUM | JSONB Data Validation JSONB fields ( required_student_uploads, cohort_metadata, uploaded_documents, values) may contain invalid JSON or unexpected structures. |
| D-04 | Low | Medium | LOW | Timestamp Field Consistencydeleted_at soft delete pattern may conflict with existing archived_at pattern in DocuSeal tables. |
| D-05 | Medium | Medium | MEDIUM | Default Value Issues Default values for status fields may not align with business logic (e.g., 'draft' vs 'waiting'). |
Mitigation Strategies:
- D-01: Test unique constraints with duplicate data; add database-level validation before migration
- D-02: Add model-level validations; use
null: falsein migration with proper defaults - D-03: Add JSON schema validation in models; use
validate: :json_schemaif available - D-04: Standardize on
deleted_atfor new tables; document pattern for future consistency - D-05: Review business requirements for default states; add comments in migration
4. Security Risks
| Risk ID | Probability | Impact | Severity | Description |
|---|---|---|---|---|
| S-01 | Medium | High | HIGH | Unauthorized Cross-Institution Data Access If multi-tenancy is accidentally enabled, students/sponsors may access data from other institutions. |
| S-02 | Low | High | MEDIUM | Email Data Exposuresponsor_email and student_email stored in plaintext; may violate privacy policies (POPIA). |
| S-03 | Medium | Medium | MEDIUM | Foreign Key Privilege Escalation Malicious user could potentially manipulate foreign keys to access unauthorized submissions or templates. |
| S-04 | Low | Medium | LOW | Soft Delete Data Leakage Soft-deleted records ( deleted_at) may still be queryable by users with direct database access. |
Mitigation Strategies:
- S-01: Add institution_id validation in all model scopes; enforce single institution in application logic
- S-02: Implement email encryption at rest using Rails
encryptsmethod; review POPIA compliance - S-03: Implement proper authorization (Cancancan) for all foreign key references; validate ownership
- S-04: Implement default scopes to filter deleted records; use paranoia gem for soft deletes
5. Performance Risks
| Risk ID | Probability | Impact | Severity | Description |
|---|---|---|---|---|
| P-01 | Medium | High | HIGH | Query Performance Degradation Joining new tables with existing tables may slow down critical workflows (cohort dashboard, enrollment lists). |
| P-02 | Medium | Medium | MEDIUM | Migration Execution Time Creating tables with multiple indexes and foreign keys may exceed 30-second threshold. |
| P-03 | Low | Medium | LOW | JSONB Query Performance Querying JSONB fields ( cohort_metadata, values) may be slower than structured columns. |
| P-04 | Low | Low | LOW | Index Bloat Multiple indexes on small tables may cause unnecessary overhead. |
Mitigation Strategies:
- P-01: Use EXPLAIN ANALYZE to optimize queries; implement eager loading; add composite indexes
- P-02: Test migration timing in staging; use
disable_ddl_transaction!for index creation if needed - P-03: Use JSONB operators efficiently; consider partial indexes on frequently queried JSONB fields
- P-04: Monitor index usage after deployment; remove unused indexes
6. Business Logic Risks
| Risk ID | Probability | Impact | Severity | Description |
|---|---|---|---|---|
| B-01 | Medium | High | HIGH | State Machine Complexity 5-step cohort workflow (draft → active → completed) with multiple datetime fields may lead to inconsistent state transitions. |
| B-02 | Medium | Medium | MEDIUM | Single Institution Constraint PRD requires single institution per deployment, but schema doesn't enforce this at database level. |
| B-03 | Low | Medium | LOW | Program Type Validationprogram_type field accepts free text; may lead to inconsistent data (learnership vs learner-ship). |
| B-04 | Medium | Medium | MEDIUM | Sponsor Email Uniqueness Multiple cohorts may share sponsor email; may cause confusion in notifications. |
Mitigation Strategies:
- B-01: Implement state machine gem (aasm); add validation callbacks; create state transition tests
- B-02: Add application-level singleton pattern; database constraint with CHECK or trigger
- B-03: Use enum or strict validation for program_type; add enum to model
- B-04: Add business logic validation; consider separate sponsor table if needed
7. Rollback & Recovery Risks
| Risk ID | Probability | Impact | Severity | Description |
|---|---|---|---|---|
| R-01 | HIGH | HIGH | CRITICAL | Failed Rollback Due to Data Dependencies If enrollments reference submissions that are deleted during rollback, migration may fail. |
| R-02 | Medium | High | HIGH | Data Loss During Rollback Rollback will drop all new tables, losing any data created during testing or partial deployment. |
| R-03 | Low | High | MEDIUM | Schema.rb Desynchronization Failed migration may leave schema.rb out of sync with actual database state. |
| R-04 | Medium | Medium | MEDIUM | Production Rollback Complexity Rollback in production requires coordination, downtime, and potential data recovery. |
Mitigation Strategies:
- R-01: Test rollback with sample data; add
dependent: :restrict_with_exceptionto prevent orphaned records - R-02: Create database backup before migration; document data retention policy; test in staging first
- R-03: Run
bin/rails db:schema:dumpafter failed migration; manually verify schema.rb - R-04: Create detailed rollback playbook; schedule maintenance window; have database administrator on standby
Risk Severity Matrix
Critical Risks (Immediate Action Required)
- T-01: Foreign Key Constraint Failures
- I-01: Template Reference Integrity
- I-02: Submission Reference Integrity
- R-01: Failed Rollback Due to Data Dependencies
High Risks (Requires Mitigation Before Deployment)
- T-02: Migration Rollback Complexity
- D-01: Unique Constraint Violations
- D-02: NOT NULL Constraint Failures
- S-01: Unauthorized Cross-Institution Data Access
- P-01: Query Performance Degradation
- B-01: State Machine Complexity
Medium Risks (Monitor and Address)
- T-03: Database Compatibility Issues
- T-04: Index Creation Performance
- I-03: Account Table Confusion
- I-04: Existing Query Performance Degradation
- S-02: Email Data Exposure
- S-03: Foreign Key Privilege Escalation
- P-02: Migration Execution Time
- B-02: Single Institution Constraint
- B-04: Sponsor Email Uniqueness
- R-02: Data Loss During Rollback
- R-04: Production Rollback Complexity
Low Risks (Acceptable or Future Mitigation)
- T-05: Schema Version Mismatch
- I-05: Active Storage Conflicts
- D-04: Timestamp Field Consistency
- D-05: Default Value Issues
- S-04: Soft Delete Data Leakage
- P-03: JSONB Query Performance
- P-04: Index Bloat
- B-03: Program Type Validation
- R-03: Schema.rb Desynchronization
Integration Verification Requirements
IV1: Existing DocuSeal Tables Remain Unchanged
Risk: HIGH - Accidental modification of existing tables Verification:
- Run
bin/rails db:schema:dumpand compare with original schema.rb - Verify no changes to
templates,submissions,submitterstables - Check that existing indexes and foreign keys are preserved
- Run existing DocuSeal test suite to ensure no regression
IV2: New Tables Reference Existing Tables Correctly
Risk: CRITICAL - Foreign key failures Verification:
- Verify
cohorts.template_idreferences validtemplates.id - Verify
cohort_enrollments.submission_idreferences validsubmissions.id - Test with non-existent IDs to ensure foreign key constraints work
- Test with deleted/archived templates/submissions to verify behavior
IV3: Database Performance Not Degraded
Risk: HIGH - Slow queries affecting user experience Verification:
- Run EXPLAIN ANALYZE on 5 critical queries before and after migration
- Measure query execution time (should be < 100ms for simple queries)
- Verify indexes are being used (check EXPLAIN output)
- Monitor database CPU/memory usage during migration
IV4: Rollback Process Works
Risk: CRITICAL - Failed rollback requiring manual intervention Verification:
- Test rollback in staging environment with sample data
- Verify all tables are dropped correctly
- Verify no orphaned foreign key constraints remain
- Verify schema.rb is restored to original state
Recommended Mitigation Actions
Pre-Migration (Required)
-
Create Database Backup
pg_dump docuseal_production > backup_20260115.sql -
Validate Existing Data
# Check for potential foreign key violations Template.where.not(id: Cohort.pluck(:template_id)).count Submission.where.not(id: CohortEnrollment.pluck(:submission_id)).count -
Test on All Database Types
- PostgreSQL (production)
- SQLite (development)
- MySQL (if supported)
-
Create Staging Environment
- Mirror production schema
- Test migration and rollback
- Performance testing
During Migration
-
Use Transaction Wrapper
ActiveRecord::Base.transaction do create_table :institutions create_table :cohorts create_table :cohort_enrollments # ... indexes and foreign keys end -
Monitor Migration Progress
- Log execution time
- Check for locks
- Monitor error logs
-
Have Rollback Ready
# Immediate rollback if issues detected bin/rails db:rollback STEP=1
Post-Migration
-
Verify Schema Integrity
bin/rails db:schema:dump git diff db/schema.rb -
Run Integration Tests
bundle exec rspec spec/integration/cohort_workflow_spec.rb bundle exec rspec spec/migrations/20260114000001_create_flo_doc_tables_spec.rb -
Monitor Production
- Check query performance
- Monitor error rates
- Verify data integrity
Risk Acceptance Criteria
Acceptable Risks
- Low-impact performance degradation (< 5% slowdown on existing queries)
- Non-critical database compatibility issues (fixable with migration updates)
- Soft delete data leakage (mitigated by application-level scopes)
Unacceptable Risks (Must Fix Before Merge)
- Foreign key constraint failures (CRITICAL)
- Data loss during rollback (CRITICAL)
- Unauthorized data access (HIGH)
- Failed migration requiring manual intervention (HIGH)
- Broken existing DocuSeal functionality (HIGH)
Testing Strategy
Unit Tests (Migration)
- Table creation verification
- Schema validation
- Index creation
- Foreign key constraints
- Reversibility
- Data integrity
Integration Tests
- Referential integrity with existing tables
- Query performance with joins
- State machine transitions
- Concurrent access scenarios
Performance Tests
- Migration execution time
- Query performance before/after
- Index usage verification
- Load testing
Security Tests
- Authorization checks
- Data access validation
- Email encryption (if implemented)
Monitoring & Alerting
During Migration
- Migration execution time > 30 seconds
- Database lock wait time > 5 seconds
- Error rate > 1%
Post-Migration
- Query performance degradation > 10%
- Foreign key violation errors
- Data integrity check failures
- User-reported issues
Rollback Plan
Trigger Conditions
- Migration execution time > 60 seconds
- Any foreign key constraint violation
- Data integrity errors
- User-reported critical issues
- Performance degradation > 20%
Rollback Steps
- Immediate: Stop migration if in progress
- Execute:
bin/rails db:rollback STEP=1 - Verify: Check schema.rb matches original
- Test: Run existing DocuSeal tests
- Notify: Alert team if manual intervention needed
Recovery Time Objective (RTO)
- Target: < 5 minutes for rollback
- Maximum: 30 minutes (including verification)
Conclusion
Story 1.1 presents MEDIUM-HIGH overall risk due to brownfield integration complexity. The primary concerns are:
- Foreign key dependencies on existing DocuSeal tables (CRITICAL)
- Rollback complexity due to data dependencies (CRITICAL)
- Performance impact on existing queries (HIGH)
- Data integrity during migration (HIGH)
Recommendation:
- ✅ Proceed with caution after implementing all mitigation strategies
- ✅ Mandatory: Test rollback in staging environment
- ✅ Mandatory: Run integration tests against existing DocuSeal test suite
- ✅ Mandatory: Create database backup before production migration
- ⚠️ Consider: Phased rollout (migrate schema first, then enable features)
Next Steps:
- Implement all pre-migration validation checks
- Create comprehensive test coverage
- Test rollback scenario
- Schedule production migration during maintenance window
- Monitor closely post-deployment
Assessment Completed By: QA Agent Date: 2026-01-15 Review Status: Ready for Development Team Review Approval Required: Yes (before branch creation)