Install
openclaw skills install afrexai-legacy-modernizationComprehensive legacy system modernization from assessment and strategy to monolith decomposition and cloud migration for any tech stack and scale.
openclaw skills install afrexai-legacy-modernizationComplete methodology for assessing, planning, and executing legacy system modernization — from monolith decomposition to cloud migration. Works for any tech stack, any scale.
system_name: "[Name]"
age_years: 0
primary_language: ""
framework: ""
database: ""
deployment: "on-prem | VM | container | serverless"
lines_of_code: 0
team_size: 0
monthly_users: 0
annual_revenue_supported: "$0"
compliance_requirements: []
known_pain_points: []
business_driver: "cost | speed | talent | risk | compliance | scale"
timeline_pressure: "low | medium | high | critical"
budget_range: "$0-$0"
sponsor: ""
Score each dimension 1-5 (1=critical, 5=healthy):
| Dimension | Score | Evidence |
|---|---|---|
| Code quality — test coverage, complexity, duplication | ||
| Architecture — coupling, modularity, clear boundaries | ||
| Infrastructure — deployment automation, monitoring, scaling | ||
| Dependencies — outdated libraries, EOL frameworks, security vulns | ||
| Data — schema quality, migration history, backup/recovery | ||
| Documentation — accuracy, coverage, onboarding effectiveness | ||
| Operations — deployment frequency, MTTR, incident rate | ||
| Security — auth patterns, encryption, audit trail, compliance gaps | ||
| Developer experience — build time, local setup, debugging tools | ||
| Business logic clarity — documented rules, test coverage of logic |
Total: /50
For each major dependency:
dependency: ""
current_version: ""
latest_version: ""
eol_date: "" # End of life
security_vulns: 0 # Known CVEs
upgrade_difficulty: "trivial | moderate | hard | rewrite"
business_risk: "low | medium | high | critical"
alternatives: []
Priority rules:
| Strategy | When to Use | Risk | Cost | Speed | Disruption |
|---|---|---|---|---|---|
| Rehost (lift & shift) | Datacenter exit, minimal change | Low | Low | Fast | Low |
| Replatform (lift & optimize) | Cloud benefits without rewrite | Low-Med | Medium | Medium | Low-Med |
| Refactor (restructure) | Good code, bad architecture | Medium | Medium | Medium | Medium |
| Re-architect (rebuild patterns) | Monolith→services, new patterns | High | High | Slow | High |
| Rebuild (rewrite) | Small system, clear requirements | Very High | Very High | Very Slow | Very High |
| Replace (buy/SaaS) | Commodity functionality | Medium | Variable | Fast | High |
| Retire | No longer needed | None | Negative | Instant | Low |
| Retain (do nothing) | Working fine, other priorities | None | Ongoing | N/A | None |
Is the system still needed?
├─ No → RETIRE
├─ Yes → Is it a commodity (CRM, email, etc.)?
│ ├─ Yes → REPLACE (buy SaaS)
│ └─ No → Is the code maintainable?
│ ├─ Yes → Is the architecture the problem?
│ │ ├─ Yes → RE-ARCHITECT (strangler fig)
│ │ └─ No → Is the infrastructure the problem?
│ │ ├─ Yes → REPLATFORM
│ │ └─ No → REFACTOR incrementally
│ └─ No → Is the system small (<50K LOC)?
│ ├─ Yes → Can requirements be clearly defined?
│ │ ├─ Yes → REBUILD
│ │ └─ No → REFACTOR + RE-ARCHITECT
│ └─ No → STRANGLER FIG (never big-bang rewrite)
NEVER do a full rewrite of a large system. It fails 70%+ of the time because:
Always use Strangler Fig instead. Replace piece by piece.
facade_name: "[API Gateway / Reverse Proxy / BFF]"
routing_rules:
- path: "/api/users/*"
target: "new-service"
status: "migrated"
migrated_date: "2025-01-15"
- path: "/api/orders/*"
target: "legacy"
status: "planned"
target_date: "2025-Q2"
- path: "/api/reports/*"
target: "legacy"
status: "not-planned"
notes: "Low priority, rarely used"
| Pattern | When | Complexity | Risk |
|---|---|---|---|
| Dual write | Both systems write simultaneously | High | Data inconsistency |
| CDC (Change Data Capture) | Stream changes from old→new DB | Medium | Lag, ordering |
| ETL batch sync | Periodic bulk sync | Low | Stale data |
| Event sourcing bridge | Events from old, replay in new | High | Schema mapping |
| Read from new, write to old | Transition period | Medium | Routing complexity |
Golden rule: Pick ONE source of truth. Never let both systems own the same data simultaneously.
Before splitting a monolith, identify bounded contexts:
context_name: ""
description: ""
team: ""
entities: []
commands: []
events_published: []
events_consumed: []
database_tables: []
external_integrations: []
coupling_score: 0 # 0=independent, 10=deeply coupled
extraction_difficulty: "easy | moderate | hard | very-hard"
business_value: "low | medium | high | critical"
Plot contexts on: Business Value (Y) × Extraction Difficulty (X)
| Easy | Moderate | Hard | |
|---|---|---|---|
| High value | 🟢 Do first | 🟡 Do second | 🟠 Plan carefully |
| Medium value | 🟢 Quick win | 🟡 Evaluate ROI | 🔴 Probably not worth it |
| Low value | 🟡 If easy, why not | 🔴 Skip | 🔴 Definitely skip |
For each service being extracted:
| Strategy | Description | Downtime | Risk |
|---|---|---|---|
| Parallel run | New DB alongside old, sync both | Zero | High complexity |
| Blue-green | Full copy, switch DNS | Minutes | Medium |
| Rolling | Migrate table by table | Zero per table | Medium |
| Big bang | Stop, migrate, start | Hours | High |
Before migrating data:
table: ""
row_count_source: 0
row_count_target: 0
count_match: false
checksum_match: false
null_analysis: "pass | fail"
referential_integrity: "pass | fail"
business_rule_validation: "pass | fail"
sample_manual_review: "pass | fail"
performance_benchmark: "pass | fail"
rollback_tested: false
Rule: All gates must pass before cutover. No exceptions.
Score each workload:
| Factor | Score (1-5) | Notes |
|---|---|---|
| Stateless design | ||
| Configuration externalized | ||
| Logging to stdout | ||
| Health check endpoint | ||
| Graceful shutdown | ||
| Horizontal scalability | ||
| Secret management | ||
| 12-factor compliance |
35-40: Cloud-native ready 25-34: Minor modifications needed 15-24: Significant refactoring 8-14: Major redesign required
For legacy systems without APIs:
endpoint: "/api/v2/orders"
legacy_source: "stored_procedure: sp_GetOrders"
new_implementation: "orders-service"
migration_status: "legacy | dual-run | new-only"
contract_changes:
- field: "order_date"
old_format: "MM/DD/YYYY string"
new_format: "ISO 8601"
adapter: "date_format_adapter"
- field: "status"
old_values: ["A", "C", "P"]
new_values: ["active", "completed", "pending"]
adapter: "status_code_mapper"
parity_tests: 47
parity_passing: 47
/ Smoke Tests \ ← Whole system alive?
/ Parity Tests \ ← Same behavior old vs new?
/ Integration Tests \ ← Services work together?
/ Contract Tests \ ← API contracts honored?
/ Performance Tests \ ← Not slower than before?
/ Data Validation Tests \ ← Data migrated correctly?
/ Unit Tests \ ← New code works?
For EVERY migrated feature:
feature: ""
test_type: "api_parity | ui_parity | data_parity"
method: "shadow traffic | replay | parallel run"
sample_size: 0
match_rate: "0%" # Target: 99.9%+
mismatches_investigated: 0
mismatches_accepted: 0 # Known intentional differences
mismatches_bugs: 0
sign_off: false
Shadow traffic — copy production requests to new system, compare responses (don't serve new responses to users yet).
| Role | Responsibility | When Needed |
|---|---|---|
| Modernization Lead | Strategy, sequencing, blockers | Full-time |
| Legacy Expert | Knows where the bodies are buried | Part-time, on-call |
| New Platform Engineer | Builds target architecture | Full-time |
| Data Engineer | Migration, sync, validation | Phase-dependent |
| QA/Test Engineer | Parity testing, automation | Full-time |
| DevOps/Platform | CI/CD, infrastructure | Part-time |
| Product Owner | Business priority, acceptance | Part-time |
The most dangerous part of modernization is losing undocumented business rules.
| Audience | Frequency | Content |
|---|---|---|
| Executive sponsor | Bi-weekly | Progress, risks, budget, timeline |
| Engineering team | Weekly | Sprint goals, technical decisions, blockers |
| Dependent teams | Monthly | Upcoming changes, migration dates, API changes |
| End users | Per migration | What's changing, when, how it affects them |
| # | Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|---|
| 1 | Undocumented business rules lost | High | Critical | Code archaeology + stakeholder interviews + parity tests |
| 2 | Timeline underestimation | Very High | High | 2x initial estimate, phase-gated checkpoints |
| 3 | Data migration corruption | Medium | Critical | Checksums, parallel runs, rollback plans |
| 4 | Feature parity gaps | High | High | Shadow traffic testing, user acceptance testing |
| 5 | Team knowledge loss (people leave) | Medium | High | Document everything, pair programming, knowledge sharing |
| 6 | Legacy system changes during migration | High | Medium | Feature freeze or dual-write contract |
| 7 | Performance regression | Medium | High | Load testing at every phase, performance budgets |
| 8 | Scope creep (improve while migrating) | Very High | Medium | Strict "migrate, don't improve" rule for Phase 1 |
| 9 | Integration failures | Medium | High | Contract testing, circuit breakers, fallback routing |
| 10 | Stakeholder fatigue | High | Medium | Quick wins early, visible progress dashboard |
Stop the modernization if:
If kill criteria triggered: Stabilize what's done, document learnings, reassess in 6 months.
Java → Modern Java (8→17+)
Python 2→3
2to3 tool for automated conversionjQuery→React/Vue
Monolith→Microservices
On-Prem→Cloud
| Anti-Pattern | Symptom | Fix |
|---|---|---|
| Distributed monolith | Services must deploy together | Identify and break coupling |
| Shared database | Multiple services write same tables | Database-per-service |
| Synchronous chains | A calls B calls C calls D | Async events, choreography |
| Nano-services | Hundreds of tiny services | Merge related services |
| Shared libraries for business logic | Library update breaks consumers | Duplicate code > shared coupling |
| No API versioning | Breaking changes cascade | Semantic versioning, deprecation policy |
project: ""
assessment_date: ""
overall_health: "green | yellow | red"
progress:
modules_total: 0
modules_migrated: 0
modules_in_progress: 0
percent_complete: "0%"
velocity:
modules_per_sprint: 0
estimated_completion: ""
on_track: true
quality:
parity_test_pass_rate: "0%"
production_incidents_from_migration: 0
rollbacks: 0
risk:
open_risks: 0
p0_risks: 0
blocked_items: 0
cost:
budget_total: "$0"
budget_spent: "$0"
budget_remaining: "$0"
burn_rate_monthly: "$0"
| Dimension | Weight | Score (0-10) | Weighted |
|---|---|---|---|
| Strategy clarity | 15% | ||
| Risk management | 15% | ||
| Testing rigor | 15% | ||
| Data integrity | 15% | ||
| Architecture quality | 10% | ||
| Team capability | 10% | ||
| Stakeholder alignment | 10% | ||
| Documentation | 10% | ||
| Total | 100% | /100 |
90-100: Exemplary — reference project 70-89: Strong — minor improvements 50-69: Adequate — address gaps Below 50: At risk — pause and reassess
## Modernization Status — Week of [DATE]
### Progress
- Modules migrated this week: [N]
- Total migrated: [N]/[TOTAL] ([X]%)
- On track for [TARGET DATE]: [Yes/No]
### Completed
- [What shipped this week]
### In Progress
- [What's being worked on]
### Blockers
- [What's stuck and what's needed]
### Risks
- [New or changed risks]
### Next Week
- [Plan for next sprint]
| Command | Action |
|---|---|
| "Assess this system for modernization" | Run full Technical Debt Inventory |
| "Which modernization strategy should we use?" | Walk through Strategy Decision Tree |
| "Plan a strangler fig migration" | Generate Strangler Facade YAML + sequence |
| "Decompose this monolith" | Domain discovery + Bounded Context mapping |
| "Migrate this database" | Data Quality Gates + migration strategy |
| "Check cloud readiness" | Run Cloud Readiness Assessment |
| "Create a migration testing plan" | Build Testing Pyramid with parity tests |
| "What are the risks?" | Generate Top 10 risk register |
| "How do we migrate from [X] to [Y]?" | Pattern-specific playbook |
| "Status update for modernization" | Generate Weekly Status Template |
| "Score this modernization project" | Run 100-Point Quality Rubric |
| "Should we kill this modernization?" | Evaluate Kill Criteria |