Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when user wants to migrate content from another CMS (WordPress, Contentful, Strapi, Sanity, Webflow, etc.) to Payload CMS
.claude/skills/asymmetric-al-cms-migration/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -35% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 73% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 11% | 0% |
Interactive workflow to design Payload collections from source CMS data. Config-first approach: establish the data structure through conversation before any data import.
Start
↓
Ask for data sample
↓
Analyze data shape
↓
Propose collection config
↓
User reviews ──────────────┐
│ │
├─ changes needed ───→ Adjust config ──→ (back to User reviews)
│
└─ looks good ───→ Config confirmed
↓
More collections? ──────┐
│ │
├─ yes ──→ (back to Ask for data sample)
│
└─ no ───→ All collections confirmed
↓
Discuss migration approach
↓
DoneWhen user provides data (JSON, CSV, or describes their schema):
Present a Payload collection config based on analysis:
typescript// Example output format export const Posts: CollectionConfig = { slug: 'posts', fields: [ { name: 'title', type: 'text', required: true }, { name: 'content', type: 'richText' }, { name: 'author', type: 'relationship', relationTo: 'users' }, // ... ], }
Explain your reasoning for each field choice. When something could go multiple ways (group vs JSON, text vs textarea, select vs relationship), ask rather than assume.
Work through uncertainties: required fields, hasMany relationships, rich text vs HTML, custom timestamps vs built-in. Continue until the user confirms the config.
After each confirmation, ask:
> "Are there other content types we should create collections for?"
If yes, loop back to Phase 1 with new data sample.
Common related collections to prompt for:
Only after ALL collections are confirmed, discuss data import:
Offer to generate a seed script or walk through manual import.
Throughout the process, watch for these:
This is the most common migration mistake. Data that looks static often needs to be dynamic.
When you see repeated string values (categories, tags, types, statuses):
json{ "category": "Technology" } { "category": "News" } { "category": "Technology" }
Don't assume it's a select field. Ask:
> "I see category has values like 'Technology', 'News'. Should this be: > - A select field with fixed options (values won't change) > - A relationship to a Categories collection (users can add/edit/remove categories later)"
Default to relationship for anything that looks like:
Use select only for:
If creating a relationship, remember to add the related collection (Categories, Tags, etc.) to the migration plan.
| Issue | How to Handle | |-------|---------------| | User provides partial data | Ask for more samples, especially edge cases | | Unclear relationships | Ask user to describe how content types connect | | Rich text ambiguity | Clarify: Lexical editor, Slate, or store raw HTML | | Missing media collection | Always confirm upload collection exists before referencing | | Overly complex nested data | Consider flattening or using blocks instead of deep groups |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 14,292 | 9,197 | -36% | 1 | 1 | 0% | 2,248 | 2,780 | +24% | 0 | 0 | — |
case-02 | pass→pass | 12,980 | 10,918 | -16% | 1 | 1 | 0% | 2,356 | 3,039 | +29% | 0 | 0 | — |
case-07 | pass→pass | 11,394 | 8,055 | -29% | 1 | 1 | 0% | 1,681 | 2,468 | +47% | 0 | 0 | — |
case-03 | fail→pass | 16,167 | 3,629 | -78% | 1 | 1 | 0% | 2,463 | 1,613 | -35% | 0 | 0 | — |
case-04 | pass→pass | 7,218 | 6,240 | -14% | 1 | 1 | 0% | 1,276 | 2,141 | +68% | 0 | 0 | — |
case-05 | fail→pass | 6,990 | 3,850 | -45% | 1 | 1 | 0% | 993 | 1,718 | +73% | 0 | 0 | — |
case-06 | pass→pass | 9,405 | 6,908 | -27% | 1 | 1 | 0% | 1,395 | 2,202 | +58% | 0 | 0 | — |
case-08 | fail→pass | 9,665 | 6,308 | -35% | 1 | 1 | 0% | 1,688 | 2,151 | +27% | 0 | 0 | — |
case-09 | pass→pass | 10,298 | 6,591 | -36% | 1 | 1 | 0% | 1,648 | 2,149 | +30% | 0 | 0 | — |
case-10 | pass→pass | 10,891 | 6,116 | -44% | 1 | 1 | 0% | 1,664 | 2,108 | +27% | 0 | 0 | — |
case-11 | fail→pass | 10,045 | 6,619 | -34% | 1 | 1 | 0% | 1,921 | 2,134 | +11% | 0 | 0 | — |
case-12 | pass→pass | 10,687 | 7,964 | -25% | 1 | 1 | 0% | 2,033 | 2,519 | +24% | 0 | 0 | — |
case-13 | fail→pass | 12,732 | 6,731 | -47% | 1 | 1 | 0% | 2,217 | 2,311 | +4% | 0 | 0 | — |
case-14 | fail→pass | 9,161 | 9,169 | +0% | 1 | 1 | 0% | 1,440 | 2,598 | +80% | 0 | 0 | — |
case-15 | fail→pass | 10,873 | 6,430 | -41% | 1 | 1 | 0% | 1,815 | 2,191 | +21% | 0 | 0 | — |
case-16 | fail→pass | 10,280 | 5,263 | -49% | 1 | 1 | 0% | 1,958 | 1,966 | +0% | 0 | 0 | — |
case-17 | pass→pass | 7,032 | 2,841 | -60% | 1 | 1 | 0% | 1,053 | 1,538 | +46% | 0 | 0 | — |
case-18 | pass→pass | 5,866 | 3,760 | -36% | 1 | 1 | 0% | 882 | 1,725 | +96% | 0 | 0 | — |
case-19 | pass→pass | 13,289 | 13,055 | -2% | 1 | 1 | 0% | 2,183 | 3,267 | +50% | 0 | 0 | — |
case-20 | pass→pass | 18,414 | 14,554 | -21% | 1 | 1 | 0% | 2,844 | 3,463 | +22% | 0 | 0 | — |
case-21 | pass→pass | 13,712 | 9,569 | -30% | 1 | 1 | 0% | 2,380 | 2,875 | +21% | 0 | 0 | — |
case-22 | pass→pass | 11,486 | 8,915 | -22% | 1 | 1 | 0% | 1,984 | 2,650 | +34% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +41 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.