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/odoo-module-developer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-15 | ✗→✗ | = Same ✗ | — | — |
| case-13 | ✗→✗ | = Same ✗ | — | — |
| case-07 | ✗→✗ | = Same ✗ | — | — |
| case-09 | ✗→✗ | = Same ✗ | — | — |
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-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-24 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
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. 24 cases were attempted. The headline lift of +4 percentage points is the difference between those two pass rates over the 24 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.