Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Plan and de-risk an Odoo version upgrade (16→17→18→19/20) using odoo-mcp's migration workbench — audit custom addons, classify upgrade-log failures into a worklist, resolve model renames, and preview JSON-2 payloads for the XML-RPC sunset. Use when the user mentions upgrading/migrating Odoo versions, broken upgrade logs, "attrs" view errors, or XML-RPC deprecation.
.claude/skills/erpipe-org-odoo-migration-copilot/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -41% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -2% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -42% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -51% | 0% |
You are assisting an Odoo version upgrade through the odoo-mcp server. Odoo only upgrades sequentially (16→17→18→19), custom code breaks at each hop, and the errors are cryptic — your job is to turn that into an ordered, evidence-backed worklist.
get_odoo_profile — confirm source version and installed modules.scan_addons_source — audit custom addons (requiresODOO_ADDONS_PATHS). Read summary.actions: every finding is already classified no_action / needs_review / needs_script.
upgrade_risk_report(source_version=..., target_version=..., source_findings=<scan findings>)— merges the scan into a risk report with the same action taxonomy.
data_quality_report directly) on the models the addons touch — NOT NULL violations at install time are usually dirty data, cheaper to fix before the upgrade than during it.
failing log. Run analyze_upgrade_log(log_text=..., source_version=..., target_version=...) — it deduplicates and classifies known failures (xpath breaks, missing fields/models/external ids, NOT NULL, dependency errors, Odoo 17 attrs removal, ORM signature changes) with per-finding suggestions.
lookup_model_historybefore concluding it was custom — many are well-known renames (account.invoice → account.move).
needs_script → needs_review, each itemwith its evidence line and suggested fix. Track items across rehearsal rounds; report what the last fix resolved.
2027). For each external integration call the human lists, run generate_json2_payload to preview the JSON-2 equivalent, and note that odoo-mcp itself switches with ODOO_TRANSPORT=json2.
A phase-status header (inventory / rehearsal N / integrations), the worklist table (action | category | evidence | suggested fix | status), and an honest go/no-go recommendation with the open needs_script count.
addon source or the staging database.
error "probably" was.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 8,792 | 5,910 | -33% | 1 | 1 | 0% | 1,520 | 1,070 | -30% | 0 | 0 | — |
case-02 | fail→fail | 23,360 | 3,878 | -83% | 1 | 1 | 0% | 3,852 | 788 | -80% | 0 | 0 | — |
case-03 | fail→fail | 14,127 | 8,366 | -41% | 1 | 1 | 0% | 2,581 | 1,343 | -48% | 0 | 0 | — |
case-04 | pass→pass | 24,850 | 25,334 | +2% | 1 | 1 | 0% | 5,463 | 6,017 | +10% | 0 | 0 | — |
case-05 | pass→pass | 15,233 | 12,992 | -15% | 1 | 1 | 0% | 2,475 | 2,478 | +0% | 0 | 0 | — |
case-06 | pass→pass | 18,228 | 15,356 | -16% | 1 | 1 | 0% | 3,167 | 3,326 | +5% | 0 | 0 | — |
case-07 | fail→pass | 14,817 | 8,964 | -40% | 1 | 1 | 0% | 2,263 | 2,196 | -3% | 0 | 0 | — |
case-08 | fail→pass | 13,138 | 3,428 | -74% | 1 | 1 | 0% | 2,062 | 1,216 | -41% | 0 | 0 | — |
case-09 | fail→pass | 11,336 | 5,851 | -48% | 1 | 1 | 0% | 1,705 | 1,665 | -2% | 0 | 0 | — |
case-10 | fail→pass | 11,010 | 2,148 | -80% | 1 | 1 | 0% | 1,816 | 1,050 | -42% | 0 | 0 | — |
case-11 | fail→pass | 26,478 | 2,258 | -91% | 1 | 1 | 0% | 2,112 | 1,045 | -51% | 0 | 0 | — |
case-12 | pass→pass | 11,776 | 5,131 | -56% | 1 | 1 | 0% | 2,004 | 1,589 | -21% | 0 | 0 | — |
case-13 | fail→fail | 16,909 | 5,643 | -67% | 1 | 1 | 0% | 2,714 | 1,048 | -61% | 0 | 0 | — |
case-14 | pass→pass | 15,428 | 8,990 | -42% | 1 | 1 | 0% | 2,367 | 2,079 | -12% | 0 | 0 | — |
case-15 | pass→pass | 11,344 | 4,131 | -64% | 1 | 1 | 0% | 1,554 | 1,290 | -17% | 0 | 0 | — |
case-16 | pass→pass | 12,559 | 7,722 | -39% | 1 | 1 | 0% | 1,964 | 1,922 | -2% | 0 | 0 | — |
case-17 | fail→pass | 9,995 | 1,610 | -84% | 1 | 1 | 0% | 1,454 | 939 | -35% | 0 | 0 | — |
case-18 | fail→pass | 14,362 | 2,352 | -84% | 1 | 1 | 0% | 2,172 | 1,103 | -49% | 0 | 0 | — |
case-19 | fail→pass | 14,600 | 7,138 | -51% | 1 | 1 | 0% | 2,358 | 1,837 | -22% | 0 | 0 | — |
case-20 | pass→pass | 9,610 | 4,880 | -49% | 1 | 1 | 0% | 1,429 | 1,404 | -2% | 0 | 0 | — |
case-21 | fail→pass | 17,283 | 2,717 | -84% | 1 | 1 | 0% | 2,885 | 1,100 | -62% | 0 | 0 | — |
case-22 | fail→pass | 10,853 | 6,632 | -39% | 1 | 1 | 0% | 1,796 | 1,770 | -1% | 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, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 18 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
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.