Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Expert guide for creating custom Odoo modules. Covers __manifest__.py, model inheritance, ORM patterns, and module structure best practices.
.claude/skills/sickn33-odoo-module-developer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 58% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 2% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 4% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 94% | 0% |
This skill transforms your AI into an expert Odoo custom module developer. It guides you through scaffolding new modules, defining models, setting up security, and following Odoo's coding conventions for both Community and Enterprise editions.
sale.order).onchange, compute, and constraint methods correctly.@odoo-module-developer and describe the module you want to build.__manifest__.py, __init__.py, models, views, and security files.Prompt: Create a module called "hospital_management" with a model for patients
Generated structure:
texthospital_management/ ├── __manifest__.py ├── __init__.py ├── models/ │ ├── __init__.py │ └── hospital_patient.py ├── views/ │ └── hospital_patient_views.xml ├── security/ │ ├── ir.model.access.csv │ └── security.xml └── data/
__manifest__.py:
python{ 'name': 'Hospital Management', 'version': '17.0.1.0.0', 'category': 'Healthcare', 'depends': ['base', 'mail'], 'data': [ 'security/ir.model.access.csv', 'views/hospital_patient_views.xml', ], 'installable': True, 'license': 'LGPL-3', }
models/hospital_patient.py:
pythonfrom odoo import models, fields, api class HospitalPatient(models.Model): _name = 'hospital.patient' _description = 'Hospital Patient' _inherit = ['mail.thread', 'mail.activity.mixin'] name = fields.Char(string='Patient Name', required=True, tracking=True) birth_date = fields.Date(string='Birth Date') doctor_id = fields.Many2one('res.users', string='Assigned Doctor') state = fields.Selection([ ('draft', 'New'), ('confirmed', 'Confirmed'), ('done', 'Done'), ], default='draft', tracking=True)
_name with a namespace (e.g., hospital.patient)._inherit = ['mail.thread'] to add chatter/logging automatically.version in manifest as {odoo_version}.{major}.{minor}.{patch}.'author' and 'website' in __manifest__.py so your module is identifiable in the Apps list._inherit.ir.model.access.csv or users will get access errors.@odoo-xml-views-builder for view XML.__manifest__.py auto-loading) — this skill targets v14+.company_id, website_id).@odoo-automated-tests for that.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | fail→fail | 17,446 | 17,622 | +1% | 1 | 1 | 0% | 3,344 | 3,825 | +14% | 0 | 0 | — |
case-01 | pass→pass | 12,703 | 21,253 | +67% | 1 | 1 | 0% | 2,688 | 4,249 | +58% | 0 | 0 | — |
case-02 | fail→pass | 12,498 | 10,694 | -14% | 1 | 1 | 0% | 2,341 | 2,861 | +22% | 0 | 0 | — |
case-03 | pass→pass | 30,061 | 7,620 | -75% | 1 | 1 | 0% | 2,290 | 2,330 | +2% | 0 | 0 | — |
case-04 | pass→pass | 17,492 | 13,471 | -23% | 1 | 1 | 0% | 3,509 | 3,649 | +4% | 0 | 0 | — |
case-05 | pass→pass | 5,949 | 6,252 | +5% | 1 | 1 | 0% | 1,053 | 2,040 | +94% | 0 | 0 | — |
case-06 | pass→pass | 6,872 | 5,419 | -21% | 1 | 1 | 0% | 1,302 | 1,950 | +50% | 0 | 0 | — |
case-07 | pass→pass | 10,812 | 8,458 | -22% | 1 | 1 | 0% | 1,790 | 2,328 | +30% | 0 | 0 | — |
case-08 | pass→pass | 12,358 | 6,584 | -47% | 1 | 1 | 0% | 2,262 | 2,200 | -3% | 0 | 0 | — |
case-09 | pass→pass | 6,074 | 5,618 | -8% | 1 | 1 | 0% | 1,086 | 1,867 | +72% | 0 | 0 | — |
case-10 | pass→pass | 7,520 | 4,063 | -46% | 1 | 1 | 0% | 1,323 | 1,659 | +25% | 0 | 0 | — |
case-20 | fail→fail | 21,698 | 20,576 | -5% | 1 | 1 | 0% | 4,602 | 5,601 | +22% | 0 | 0 | — |
case-11 | pass→pass | 5,887 | 5,147 | -13% | 1 | 1 | 0% | 797 | 1,734 | +118% | 0 | 0 | — |
case-12 | pass→pass | 4,867 | 3,316 | -32% | 1 | 1 | 0% | 841 | 1,498 | +78% | 0 | 0 | — |
case-13 | pass→pass | 4,731 | 3,004 | -37% | 1 | 1 | 0% | 932 | 1,494 | +60% | 0 | 0 | — |
case-14 | pass→pass | 8,772 | 5,000 | -43% | 1 | 1 | 0% | 1,575 | 1,844 | +17% | 0 | 0 | — |
case-21 | fail→fail | 14,442 | 15,851 | +10% | 1 | 1 | 0% | 2,784 | 4,064 | +46% | 0 | 0 | — |
case-15 | pass→pass | 12,031 | 18,685 | +55% | 1 | 1 | 0% | 2,276 | 2,969 | +30% | 0 | 0 | — |
case-16 | pass→pass | 12,942 | 14,398 | +11% | 1 | 1 | 0% | 2,193 | 3,186 | +45% | 0 | 0 | — |
case-17 | pass→pass | 10,094 | 9,116 | -10% | 1 | 1 | 0% | 1,925 | 2,602 | +35% | 0 | 0 | — |
case-18 | pass→pass | 10,398 | 7,983 | -23% | 1 | 1 | 0% | 1,874 | 2,324 | +24% | 0 | 0 | — |
case-19 | pass→pass | 8,492 | 5,149 | -39% | 1 | 1 | 0% | 1,553 | 1,915 | +23% | 0 | 0 | — |
case-23 | fail→fail | 22,295 | 16,710 | -25% | 1 | 1 | 0% | 4,074 | 4,461 | +9% | 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. 23 cases were attempted. The headline lift of +4 percentage points is the difference between those two pass rates over the 23 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.