Skip to main content
AIDiveForge AIDiveForge
🚚

Migration Plan Writer

Code & Development · by AIDiveForge · Apr 20, 2026 · Intermediate

Plan an incremental schema migration with compatibility and recovery checks.

Get ordered phases, validation queries, cutover criteria and rollback limits.

Free · 2 KB · SKILL.md, instructions and example files. Provide before/after schemas, database engine, volume, deployment model and recovery constraints.

A worked example

A small example to try before using your own data.

Input

{
  "before": "users.full_name TEXT NOT NULL",
  "after": "users.display_name TEXT NOT NULL",
  "rolling_deploy": true
}

Expected result

1 Add nullable display_name. 2 Deploy dual-write/read-fallback behavior. 3 Backfill in resumable primary-key batches. 4 Verify no missing or divergent values. 5 Switch reads. 6 Remove full_name only after old readers are gone and a verified recovery path exists.

What to check: A rename alone would break old readers. Include a check and rollback condition before every irreversible phase.

Limits: The plan is not a guarantee of zero downtime. Engine-specific locks and recovery behavior require testing on a representative environment.

Worked example included. Model-specific performance and vendor compatibility have not been benchmarked.

Installation options and other formats

Install this skill

An agent skill starts with SKILL.md. The ZIP also includes its examples and any helper scripts. Drop the file into your tool of choice — or pick a different format if you use Cursor, Windsurf, Copilot, or something else.

Download SKILL.md
python3 - <<'ADF_SKILL_INSTALL'
import hashlib, io, os, stat, tempfile, urllib.request, zipfile
from pathlib import Path, PurePosixPath
folder = "migration-plan-writer"
root = Path(os.environ.get('ADF_SKILL_ROOT', str(Path.home() / '.claude' / 'skills'))).expanduser()
destination = root / folder
if destination.exists() or destination.is_symlink():
    raise SystemExit('An installation already exists. Back it up and merge the ZIP deliberately.')
root.mkdir(parents=True, exist_ok=True)
request = urllib.request.Request("https://aidiveforge.com/skill/migration-plan-writer.zip", headers={'User-Agent': 'AIDiveForge-Resource-Installer/1.0 (+https://aidiveforge.com/skills/)'})
with urllib.request.urlopen(request, timeout=30) as response:
    data = response.read(8 * 1024 * 1024 + 1)
if len(data) > 8 * 1024 * 1024 or hashlib.sha256(data).hexdigest() != "95a20929a354dde467a98460b0ec6d6d6d3a75986eeefed07e204eff6d0b7693":
    raise SystemExit('The download did not match this reviewed bundle. No files were installed.')
with zipfile.ZipFile(io.BytesIO(data)) as archive, tempfile.TemporaryDirectory(prefix='.adf-skill-', dir=root) as temporary:
    members = archive.infolist()
    if len(members) > 100 or sum(m.file_size for m in members) > 16 * 1024 * 1024:
        raise SystemExit('Unexpected archive size')
    for member in members:
        name = PurePosixPath(member.filename)
        if name.is_absolute() or '..' in name.parts or not name.parts or name.parts[0] != folder or '\\' in member.filename or stat.S_ISLNK(member.external_attr >> 16):
            raise SystemExit('Unsafe archive entry; nothing was installed')
        target = Path(temporary).joinpath(*name.parts)
        if member.is_dir():
            target.mkdir(parents=True, exist_ok=True)
        else:
            target.parent.mkdir(parents=True, exist_ok=True)
            with target.open('xb') as stream:
                stream.write(archive.read(member))
    staged = Path(temporary) / folder
    if not (staged / 'SKILL.md').is_file() or destination.exists() or destination.is_symlink():
        raise SystemExit('The skill could not be installed without replacing existing data')
    os.rename(staged, destination)
print('Installed the complete skill folder:', destination)
ADF_SKILL_INSTALL

Claude Code: ~/.claude/skills/migration-plan-writer/SKILL.md. Codex: ~/.codex/skills/migration-plan-writer/SKILL.md. Keep the complete ZIP folder when helper scripts are included.

🧠 Why it works

A rename alone would break old readers. Include a check and rollback condition before every irreversible phase.

⚙️ How it works

  1. Identify destructive changes, lock risks, old/new application compatibility and the required recovery point.
  1. Prefer expand, backfill, validate, switch and contract phases where both application versions need to coexist.
  1. Define small resumable batches, stable checkpoints and reconciliation queries for any data backfill.
  1. State rollback behavior for each phase, including when rollback requires restoring or replaying data.
  1. Keep the output as a plan until the user has authorized the actual migration and the target is verified.

Description

Get ordered phases, validation queries, cutover criteria and rollback limits.

Provide before/after schemas, database engine, volume, deployment model and recovery constraints.

Limits: The plan is not a guarantee of zero downtime. Engine-specific locks and recovery behavior require testing on a representative environment.

Recommended Use

Tools and workflow packs this skill pairs well with. Forge picks are auto-generated from category + capability signals; Community picks are added by people who've used the pairing.

No matches yet. Be the first to suggest a pairing, or the Forge will populate suggestions as signals align.