Help us improve
Share bugs, ideas, or general feedback.
From migration-planner
Run cross-reference analysis on all collected discovery data to identify risks, dependency chains, active complexity multipliers, and discovery gaps.
npx claudepluginhub twofoldtech-dakota/plugin-migration-plannerHow this skill is triggered — by the user, by Claude, or both
Slash command
/migration-planner:migrate-analyzeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Run cross-reference analysis on all collected discovery data to identify risks, dependency chains, active complexity multipliers, and discovery gaps.
Performs unified gap analysis by parsing natural language intent, routing to specialized skills for security/compliance/testing/etc., aggregating findings into matrices with historical trends and remediation roadmaps.
Consolidates outputs from all detect skills into a unified scored index with risk heatmap and unknowns backlog. Invoke after running multiple detect audits.
Identifies, assesses, and manages project, business, and technical risks using risk registers, probability/impact matrices, and structured mitigation strategies.
Share bugs, ideas, or general feedback.
Run cross-reference analysis on all collected discovery data to identify risks, dependency chains, active complexity multipliers, and discovery gaps.
get_assessment with project_path set to the current working directory. If it returns null, fall back to reading .migration/assessment.json. Verify an assessment exists.get_discovery with the assessment ID (no dimension filter) to get all discovery data. If it returns null, fall back to reading ALL files in .migration/discovery/.get_composed_heuristics with the assessment_id. This automatically resolves all knowledge packs from the assessment's source_stack/target_stack, flattens and merges all heuristic types (effort hours, multipliers, gotcha patterns, dependency chains, phase mappings, roles), and overlays migration path gotchas and effort adjustments. The response includes migration_path_id and packs_used. No separate get_migration_path call is needed for incompatibilities — the composed result already includes path gotchas.get_heuristics with pack_ids derived from the assessment (e.g., ["sitecore-xp"] from source_stack.platform). If source_stack is empty, fall back to ["sitecore-xp"]. Also call get_migration_path separately for incompatibilities.skills/migrate-knowledge/:
heuristics/gotcha-patterns.jsonheuristics/complexity-multipliers.jsonheuristics/dependency-chains.jsonknowledge/known-incompatibilities.mdknowledge/aws-to-azure-service-map.jsonFor each pattern in gotcha-patterns.json:
For each multiplier in complexity-multipliers.json:
supersedes field, only apply the highest-matching multiplierUsing dependency-chains.json:
Look for combinations of factors that amplify risk:
Rate each risk as:
For each discovery dimension:
not_started: Flag as high-impact gappartial: List specific unanswered questions and their impact"confidence": "unknown" or "assumed": Flag as assumption needing validationPrioritize gaps by their impact on estimate accuracy.
completeness = (complete_dimensions + 0.5 * partial_dimensions) / total_dimensions
Step 1 — Save to MCP (primary): Call the save_analysis MCP tool with the assessment ID and all analysis data (risks, active_multipliers, dependency_chains, risk_clusters, assumptions, and gaps). This performs an atomic replace of all analysis data for this assessment.
Step 2 — Write JSON snapshot: Write .migration/analysis.json:
{
"generated_at": "ISO date",
"discovery_completeness": 0.85,
"risks": [
{
"id": "risk-1",
"source": "gotcha:exm_ip_warming",
"severity": "high",
"category": "email",
"description": "New Azure IPs have no sending reputation...",
"affected_components": ["exm_dispatch"],
"mitigation": "Plan 2-4 week IP warming ramp...",
"estimated_hours_impact": 40
}
],
"dependency_chains": [
{
"chain": ["networking_vnet", "compute_single_role", "database_single", "identity_server", "testing_validation", "cutover_execution", "dns_cutover"],
"critical_path": true,
"estimated_total_hours": 0
}
],
"parallel_tracks": [
{
"name": "Search Track",
"chain": ["solr_standalone"],
"starts_after": "networking_vnet"
}
],
"complexity_multipliers_active": [
{
"id": "multi_cd",
"multiplier": 1.3,
"reason": "4 CD instances detected",
"applies_to": ["compute_single_role", "networking_vnet", "cdn_setup", "testing_validation"],
"evidence": "discovery.compute.cd_instances = 4"
}
],
"risk_clusters": [
{
"name": "Email Deliverability",
"severity": "high",
"contributing_factors": ["EXM enabled", "Dedicated IPs", "100K+ monthly volume"],
"combined_hours_impact": 52,
"description": "..."
}
],
"gaps": [
{
"dimension": "networking",
"status": "not_started",
"impact": "high",
"impact_description": "Cannot accurately estimate VPN/ExpressRoute complexity or networking effort"
}
],
"assumptions": [
{
"dimension": "compute",
"question": "compute_os_version",
"assumed_value": "Windows Server 2019",
"basis": "Inferred from Sitecore 10.3",
"impact_if_wrong": "low"
}
]
}
After writing analysis.json, generate .migration/assumptions-registry.json — a formal registry linking every assumption to its impact on estimates.
Scan ALL discovery files for:
"confidence": "assumed" → create assumption with confidence: "assumed""confidence": "unknown" → create assumption with confidence: "unknown"confidence: "assumed" and note the inference rule as basisFor each assumption:
Identify affected components — which base-effort-hours.json components does this answer influence? Cross-reference with complexity-multipliers.json to find multipliers triggered by this assumed data.
Calculate hours_if_wrong — estimate the effort impact if the assumed value turns out to be wrong:
low: Minimal rework (e.g., assumed Windows Server 2019, actually 2022 — similar effort)expected: Moderate rework (e.g., assumed 2 CD instances, actually 4 — triggers multiplier)high: Significant rework (e.g., assumed no custom shard map, actually has one — 24hr gotcha)Calculate pessimistic_widening_hours — the hours added to the pessimistic estimate for this unvalidated assumption. Use the expected value from hours_if_wrong as the default widening.
Each assumption gets:
id: ASMP-001 through ASMP-NNN (sequential)source: File path and question ID (e.g., discovery/compute.json#compute_cm_instance_count)dimension: Which discovery dimension this belongs toquestion_id: The specific question from the discovery treeassumed_value: The current assumed or inferred valuebasis: Why this value was assumed (inference rule, default, user said "I don't know")confidence: "assumed" or "unknown"validation_status: Initially "unvalidated" for allvalidation_method: Suggested way to confirm (e.g., "Check AWS EC2 console", "Ask client DBA")affected_components: Array of component IDs from base-effort-hours.jsonhours_if_wrong: { "low": N, "expected": N, "high": N }pessimistic_widening_hours: Number (the expected hours_if_wrong value)confidence_score = (validated_assumptions + confirmed_discovery_answers) / total_data_points × 100
Where total_data_points = all discovery answers (confirmed + assumed + unknown) + all registered assumptions.
Since this is the initial generation, validated_assumptions starts at 0. The score reflects the current state of confirmed discovery data.
The assumptions are already saved to SQLite as part of the save_analysis call in step 8. Now write the JSON snapshot.
Write .migration/assumptions-registry.json:
{
"generated_at": "ISO date",
"summary": {
"total_assumptions": 12,
"validated": 0,
"unvalidated": 12,
"by_confidence": {
"assumed": 7,
"unknown": 5
},
"total_hours_at_risk": 96,
"total_pessimistic_widening": 72,
"confidence_score": 65
},
"assumptions": [
{
"id": "ASMP-001",
"source": "discovery/compute.json#compute_cm_instance_count",
"dimension": "compute",
"question_id": "compute_cm_instance_count",
"assumed_value": "1",
"basis": "Inferred from XP Scaled topology default",
"confidence": "assumed",
"validation_status": "unvalidated",
"validation_method": "Confirm with client's AWS admin — check EC2 console for CM instance count",
"affected_components": ["compute_single_role"],
"hours_if_wrong": { "low": 4, "expected": 8, "high": 16 },
"pessimistic_widening_hours": 8
}
]
}
Present the analysis conversationally, organized by severity:
Include the confidence score prominently:
Estimate Confidence: {score}% — {N} assumptions registered, {M} validated. Validate the top {K} assumptions to improve confidence to ~{target}%.
End with recommendations:
/migrate gaps for detailed gap analysis and assumption validation/migrate estimate if completeness is sufficient (>70%)pessimistic_widening_hours)Update .migration/assessment.json:
"status": "analysis" (if not already past this stage)"updated" timestampAfter analysis is saved, suggest running a challenge review:
Analysis complete! Before moving to estimation, consider running
/migrate challenge analysisto validate risk coverage, check assumption consistency, and verify mitigation strategies against current Azure capabilities. This is optional but recommended.
Before starting analysis, check if the assessment has challenge_required: true. If so, call get_challenge_reviews for the discovery step. If no review exists with status passed or conditional_pass, inform the user:
This assessment requires challenge reviews before advancing. Run
/migrate challenge discoveryfirst to validate discovery data quality, then re-run/migrate analyze.